iMovie (no sin pérdidas, pero mejor que antes)
iMovie v10 (publicado un tiempo después de que se hizo la pregunta originalmente) ahora maneja mejor más tipos de medios, por lo que evita la re-codificación de importación para la mayoría del contenido H.264 (mp4, m4v, mov, AVHDC, mts, mt2s).
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 estar más cerca de las pérdidas. Sospecho que esta parte de la respuesta puede aplicarse igualmente a otro software de edición de video 'basado en proyectos' (por ejemplo, Premiere o Final Cut) porque creo que generalmente todos se vuelven a codificar en la salida, aunque generalmente son muy fáciles de usar para un recorte preciso.
Personalmente, en general creo que una nueva codificación no es un gran problema, pero entiendo que pediste específicamente una solución sin pérdidas, así que ...
Sin pérdidas (¡pero mucho más complicado!)
Existen limitaciones técnicas en cuanto a la precisión con la que puede cortar un video sin tener que volver a codificar al menos una parte, y básicamente depende de la frecuencia de i-frame. Si cada fotograma es un i-frame, puede cortar en cualquier lugar, pero si son solo cada pocos segundos, entonces solo puede cortar sin pérdida en esos i-frames sin perder contenido o tener que volver a codificar (al menos parte de la stream) para que pueda comenzar con un i-frame.
ffmpeg
Este SO Q&A plantea específicamente 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 como el 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 el -acodec copy
y -vcodec copy
decirle a ffmpeg que no vuelva a codificar.
No estoy exactamente seguro de qué sucede si cortas demasiado pronto, pero creo que el video está esencialmente en blanco (o tal vez corrupto, dependiendo del jugador) hasta que encuentre un i-frame. Por lo tanto, es probable que desee encontrar el i-frame más cercano antes de su corte. Esta respuesta resuelve ese problema usando ffprobe
y awk
, aunque un poco incómodo. Esencialmente, utiliza ffprobe
para escanear los cuadros y encontrar el fotograma clave más cercano ( flags=K
) antes de su punto de corte ideal. La salida completa para cada cuadro 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 necesita cortar en algún lugar entre dos i-frames, puede dividir el video y volver a unirse. Según 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
hay un archivo de texto simple que enumera 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 muy cerca de sin pérdidas), con un poco de violín; El nivel de dificultad depende de cuán exigente sea con respecto al punto de partida preciso y la frecuencia de los fotogramas i.