A menudo es necesario que la comunidad de desarrolladores de código abierto o activo publique grandes segmentos de video en línea. (Videos de encuentros, campamentos, charlas tecnológicas ...) Siendo que soy un desarrollador y no un camarógrafo, no deseo desembolsar el rasguño adicional en una cuenta premium de Vimeo. ¿Cómo puedo tomar un video de charla técnica MPEG de 12.5 GB (1:20:00) y dividirlo en segmentos de 00:10:00 para cargarlo fácilmente en sitios para compartir videos?
ffmpeg
video-editing
Gabriel
fuente
fuente
Respuestas:
Envolver esto en un script para hacerlo en un bucle no sería difícil.
Tenga en cuenta que si intenta calcular el número de iteraciones en función de la duración de salida de una
ffprobe
llamada, esto se estima a partir de la tasa de bits promedio al inicio del clip y el tamaño del archivo del clip a menos que proporcione el-count_frames
argumento, lo que ralentiza considerablemente su funcionamiento .Otra cosa a tener en cuenta es que la posición de la
-ss
opción en la línea de comando es importante . Donde lo tengo ahora es lento pero preciso. La primera versión de esta respuesta dio la alternativa rápida pero imprecisa . El artículo vinculado también describe una alternativa en su mayoría rápida pero precisa, que paga con un poco de complejidad.Aparte de eso, no creo que realmente quieras cortar exactamente 10 minutos para cada clip. Eso pondrá cortes justo en el medio de las oraciones, incluso las palabras. Creo que deberías usar un editor o reproductor de video para encontrar puntos de corte naturales a solo 10 minutos de diferencia.
Suponiendo que su archivo está en un formato que YouTube puede aceptar directamente, no tiene que volver a codificar para obtener segmentos. Simplemente pase las compensaciones del punto de corte natural a
ffmpeg
, diciéndole que pase el A / V codificado sin tocarlo usando el códec "copiar":El
-c copy
argumento le dice que copie todas las secuencias de entrada (audio, video y potencialmente otras, como subtítulos) en la salida tal como está. Para programas de A / V simples, es equivalente a las banderas más detalladas-c:v copy -c:a copy
o las banderas de estilo antiguo-vcodec copy -acodec copy
. Usaría el estilo más detallado cuando quiera copiar solo una de las transmisiones, pero vuelva a codificar la otra. Por ejemplo, hace muchos años había una práctica común con los archivos QuickTime para comprimir el video con video H.264 pero dejar el audio como PCM sin comprimir ; si se encuentra con un archivo de este tipo hoy, podría modernizarlo-c:v copy -c:a aac
para reprocesar solo la transmisión de audio, dejando el video intacto.El punto de inicio para cada comando anterior después del primero es el punto de inicio del comando anterior más la duración del comando anterior.
fuente
ffmpeg
necesita mantener la sincronización entre las transmisiones de audio y video puede no estar presente en el archivo fuente. Si esto le está sucediendo, existen métodos más complicados de división que evitan el problema.Aquí está la solución de una línea :
Tenga en cuenta que esto no le ofrece divisiones precisas, pero debe adaptarse a sus necesidades. En cambio, se cortará en el primer fotograma después del tiempo especificado después
segment_time
, en el código anterior sería después de la marca de 20 minutos.Si encuentra que solo se puede reproducir el primer fragmento, intente agregar
-reset_timestamps 1
como se menciona en los comentarios.fuente
-reset_timestamps 1
soluciona el problema para míEnfrenté el mismo problema anteriormente y armé un script simple de Python para hacer exactamente eso (usando FFMpeg). Disponible aquí: https://github.com/c0decracker/video-splitter , y pegado a continuación:
fuente
Si desea crear realmente los mismos fragmentos, debe forzar ffmpeg para crear i-frame en el primer cuadro de cada fragmento para que pueda usar este comando para crear un fragmento de 0.5 segundos.
fuente
Una forma alternativa más legible sería
Aquí está la fuente y la lista de los comandos FFmpeg utilizados comúnmente.
fuente
Tenga en cuenta que la puntuación exacta del formato alternativo es
-ss mm:ss.xxx
. Luché durante horas tratando de usar el intuitivo pero incorrectomm:ss:xx
en vano.Referencias aquí y aquí .
fuente
fuente
Simplemente use lo que está integrado en ffmpeg para hacer exactamente esto.
Esto lo dividirá en mandriles de aproximadamente 2 segundos, se dividirá en los fotogramas clave relevantes y generará los archivos cam_out_h2640001.mp4, cam_out_h2640002.mp4, etc.
fuente