iMovie (no sin pérdidas, pero mejor que antes)
iMovie v10 (publicado un tiempo después de que se formuló la pregunta) ahora maneja mejor más tipos de medios, por lo que evita la importación y recodificación para la mayoría de H.264 (mp4, m4v, mov, AVHDC , mts, mt2s) contenido.
Sin embargo, todavía se volverá a codificar en la exportación, por lo que no puede ser técnicamente sin pérdidas. Sin embargo, otra característica nueva es la capacidad de personalizar la calidad de la exportación, que puede ser casi sin pérdidas. Sospecho que esta parte de la respuesta se puede aplicar por igual a otro software de edición de video "impulsado por proyectos" (por ejemplo, Premiere o Final Cut) porque creo que todos generalmente se recodifican en la salida, aunque generalmente son muy fáciles de usar para un recorte preciso.
Personalmente, generalmente creo que una sola recodificación no es un gran problema, pero entiendo que solicitó específicamente una solución sin pérdidas, así que ...
Sin pérdidas (¡pero mucho más complicado!)
Hay limitaciones técnicas en cuanto a la precisión con la que se puede cortar un video sin tener que volver a codificar al menos parte de él, y básicamente depende de la frecuencia de i-frame. Si cada fotograma es un i-frame, puede cortar en cualquier lugar, pero si solo lo hace cada pocos segundos, solo puede cortar sin pérdida en esos i-frames sin perder contenido o tener que volver a codificar (al menos parte del para que pueda comenzar con un i-frame.
ffmpeg
Este SO Q & amp A A específicamente plantea la cuestión de cómo cortar entre i-frames usando ffmpeg
. No conozco ninguna aplicación GUI para hacer esto, pero básicamente ejecutas un comando similar al siguiente:
ffmpeg -i input.m4v -vcodec copy -acodec copy -ss 00:01:20.000 -t 00:37:50.000 output.m4v
Los dos tiempos especificados son inicio y duración , y pueden especificarse como segundos o hh:mm:ss.ss
, y -acodec copy
y -vcodec copy
le dicen a ffmpeg no para recodificar.
No estoy exactamente seguro de qué sucede si cortas demasiado pronto, pero pienso que el video está esencialmente en blanco (o tal vez está dañado, según el reproductor) hasta que encuentra un i-frame. Así que probablemente querrás encontrar el i-frame más cercano antes de tu corte. Esta respuesta resuelve ese problema usando ffprobe
y awk
, aunque sea un poco incómodo. Esencialmente, usa ffprobe
para escanear los marcos y encontrar el fotograma clave más cercano ( flags=K
) antes de su punto de corte ideal. La salida completa para cada fotograma del video se puede ver así:
ffprobe -select_streams v -show_frames <INPUT>
La respuesta vinculada proporciona este comando para encontrar un fotograma clave antes de un tiempo específico:
ffprobe -select_streams v -show_frames -v quiet INPUT.mp4 |
awk -F= '
/pict_type=/ { if (index($2, "I")) { i=1; } else { i=0; } }
/pkt_pts_time/ { if (i && ($2 >= 150)) print $2; }
' | head -n 1
Y, finalmente, si realmente necesitas cortar entre dos i-frames, puedes dividir el video y volver a unirte. Sobre la base de la información de esta respuesta , debería ser algo como:
ffmpeg -f concat -i list_of_videos.txt -c copy OUTPUT.mp4
Donde list_of_videos.txt
es un archivo de texto simple que lista los archivos que desea concatenar.
Resumen
iMovie es probablemente lo suficientemente bueno para la mayoría de los casos (desde v10), y muy fácil.
ffmpeg puede hacerlo sin pérdidas (o casi sin pérdidas), con un poco de manipulación; el nivel de dificultad depende de lo exigente que seas sobre el punto de inicio y la frecuencia precisos de los i-frames.