iMovie (sin pérdidas, pero mejor que antes)
iMovie v10 (lanzada en algún momento después de que la pregunta se pidió originalmente) ahora mejor maneja más tipos de medios, lo que se evita la importación de re-codifican para la mayoría de H. 264 (mp4, m4v, mov, AVHDC, mts, mt2s) contenido.
Todavía, sin embargo, re-codificar en la exportación por lo que no puede ser técnicamente sin pérdidas-otra nueva característica, sin embargo, es la posibilidad de personalizar la calidad de exportación, que puede estar más cerca de la pérdida. Sospecho que esta parte de la respuesta puede aplicar por igual a otro "proyecto impulsado por' software de edición de vídeo (por ejemplo, Premiere o Final Cut), porque creo que, en general, todos re-codificar en la salida, aunque son por lo general muy fácil de usar para cortes precisos.
Personalmente, yo en general creo que un solo re-codificar no es un gran problema, pero entiendo que usted hizo pedir específicamente para una compresión sin pérdida de la solución, así que...
Lossless (pero la manera más complicado!)
Existen limitaciones técnicas en cuanto a la precisión con que se puede cortar un video sin tener que volver a codificar, al menos parte de ella, y depende básicamente de la i-frame frecuencia. Si cada fotograma es un i-frame, se puede cortar en cualquier lugar, pero si son sólo cada pocos segundos, a continuación, sólo se puede cortar sin pérdida en los i-frames sin perder el contenido o tener que volver a codificar (al menos una parte de la secuencia) para que pueda comenzar con un i-frame.
ffmpeg
Esto ASÍ Q&A , específicamente, se plantea la cuestión de cómo cortar entre los i-frames con ffmpeg
. No sé de ninguna GUI de aplicaciones para ello, pero básicamente ejecutar 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
Las dos veces que se especifican son los de inicio y duración, y puede ser especificado como segundos o hh:mm:ss.ss
, y el -acodec copy
y -vcodec copy
dicen ffmpeg no volver a codificar.
No estoy exactamente seguro de lo que sucede si se corta demasiado pronto, pero yo creo que el video es esencialmente un espacio en blanco (o tal vez corruptos, dependiendo del jugador) hasta que se encuentra con un i-frame. Así que es probable que desee para encontrar el más cercano de i-frame antes de su corte. Esta respuesta se soluciona ese problema con ffprobe
y awk
, aunque un poco torpe. Esencialmente se utiliza ffprobe
para escanear los marcos y encontrar el más cercano de fotograma clave (flags=K
) antes de su talla ideal. Potencia total de salida para cada fotograma de vídeo puede ser visto como este:
ffprobe -select_streams v -show_frames <INPUT>
Los enlaces de respuesta de los suministros de este comando para buscar 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 por último, si usted realmente necesita para cortar en algún lugar entre dos fotogramas i, se puede dividir el vídeo y volver a unirse. Basado en la información de esta respuesta, debe 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 listado de 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érdida (o muy cerca sin pérdida), con un poco de tocar el violín; el nivel de dificultad depende de cómo exigente que están sobre el punto exacto de partida, y la frecuencia de los i-frames.