Concatenación de archivos multimedia divididos utilizando el "protocolo concat"

Estoy usando el último ffmpeg (3.2.4) en Windows 10 de 64 bits.

Mis dispositivos generalmente dividen los archivos que guardan en las tarjetas SD, ya sea con un límite de tamaño de archivo de 2G o 4G.

Antes de importar los archivos a mi línea de tiempo, sería muy conveniente volver a concatenar los archivos lógicos en un archivo físico. De esta manera, no tengo "partes" que deban mantenerse juntas, y aplicar configuraciones a un clip no requiere duplicar todo en los segmentos de continuación.

Naturalmente, el códec y el contenedor siempre serán idénticos en todas las piezas.

Primero probé los archivos WAV que obtuve de la grabadora Zoom H4N. Lo intenté:

ffmpeg -i "concat:ste-000.wav|ste-001.wav" -c copy Zoom.wav

y el resultado fue solo la primera parte nuevamente, sin concatenación. Es decir, el archivo tenía aprox. 2 GB de tamaño, pero no idéntico a la primera parte. No hubo ningún mensaje de error. No pensé que fuera extraño que la información mostrada al comienzo de la ejecución solo mostrara el primer archivo, ya que se supone que las partes tienen un formato idéntico, por lo que solo tiene que olfatear una para averiguarlo.

Las últimas líneas de salida (que se muestran a continuación) muestran que el tiempo de los medios es el mismo que el de la primera parte (1:02).

Entonces, supongo que simplemente no funciona en WAV. Los documentos que leí son bastante vagos. Pero tampoco hay error de ningún tipo .

Luego lo probé con archivos MOV de la cámara Canon.

Una vez más, no hubo ningún error, pero el resultado fue solo el tamaño (aproximado) del primer archivo, que es de 4 GB en este dispositivo. Y el tiempo que informó para el archivo de salida, unos 18 minutos, es solo el del primer segmento. ¡No los concatenó!

Entonces, ¿hay algo mal o desactualizado con la documentación? ¿No funciona en Windows por alguna razón (creo que estar entre comillas debería evitar que los caracteres de tubería sean un problema), porque en todos los casos parece ignorar el comando después del primer archivo?


Terminé usando el demuxer concat en su lugar, que funcionó bien pero no es tan simple ya que no puedo simplemente nombrar los archivos en la línea de comando.

¿Por qué no funciona el formulario “fácil”? Más concretamente, ¿por qué no hay ningún error, pero ignora todo menos el primer archivo?


[\\OORT\Media\Video-work\2017\Abril\29 UNT\original]ffmpeg -i "concat:ste-000.wav|ste-001.wav" -c copy Zoom.wav
ffmpeg versión 3.2.4 Copyright (c) 2000-2017 los desarrolladores de FFmpeg
  construido con gcc 6.3.0 (GCC)
  configuración:--disable-static --enable-shared --enable-gpl --enable-version3 --enable-d3d11va --enable-dxva2 --enable-libmfx --enable-nvenc --enable-avisynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnutls --enable-iconv --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libfreetype --enable-libgme --habilitar-libgsm --habilitar-libilbc --habilitar-libmodplug --habilitar-libmp3lame --habilitar-libopencore-amrnb --habilitar-libopencore-amrwb --habilitar-libopenh264 --habilitar-libopenjpeg --habilitar-libopus - -habilitar-librtmp --habilitar-libsnappy --habilitar-libsoxr --habilitar-libspeex --habilitar-libtheora --habilitar-libtwolame --habilitar-libvidstab --habilitar-libvo-amrwbenc --habilitar-libvorbis --habilitar- libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxavs --enable-libxvid --enable-libzimg --enable-lzma --enable-zlib--habilitar-zlib--habilitar-zlib
  libavutil 55. 34.101 / 55. 34.101
  libavcodec 57. 64.101 / 57. 64.101
  formato libav 57. 56.101 / 57. 56.101
  dispositivo libav 57. 1.100 / 57. 1.100
  filtro libav 6. 65.100 / 6. 65.100
  libswscale 4. 2.100 / 4. 2.100
  libswresamp 2. 3.100 / 2. 3.100
  libpostproc 54. 1.100 / 54. 1.100
Diseño de canal adivinado para Input Stream #0.0: estéreo
Entrada #0, wav, desde 'concat:ste-000.wav|ste-001.wav':
  Metadatos:
    codificado_por: ZOOM Handy Recorder H4n
    fecha : 2008-01-01
    tiempo_de_creación: 04:46:57
    tiempo_referencia: 1652832000
    codificación_historia: A = PCM, F = 96000, W = 24, M = estéreo, T = ZOOM Handy Recorder H4n
  Duración: 01:02:06.51, tasa de bits: 8696 kb/s
    Transmisión #0:0: Audio: pcm_s24le ([1][0][0][0] / 0x0001), 96000 Hz, estéreo, s32 (24 bit), 4608 kb/s
Salida #0, wav, a 'Zoom.wav':
  Metadatos:
    PICO : ZOOM Handy Recorder H4n
    ICRD : 2008-01-01
    codificación_historia: A = PCM, F = 96000, W = 24, M = estéreo, T = ZOOM Handy Recorder H4n
    tiempo_referencia: 1652832000
    ISFT: Lavf57.56.101
    Transmisión #0:0: Audio: pcm_s24le ([1][0][0][0] / 0x0001), 96000 Hz, estéreo (24 bits), 4608 kb/s
Mapeo de flujo:
  Transmisión #0:0 -> #0:0 (copiar)
Presione [q] para detener, [?] para obtener ayuda
tamaño = 2096160kB tiempo = 01:02:06,50 tasa de bits = 4608,0 kbits/s velocidad = 15,6x
video:0kB audio:2096160kB subtítulo:0kB otros flujos:0kB encabezados globales:0kB sobrecarga muxing: 0.000007%
[P:\video-out]\\OORT\Media\Video-work\2017\Abril\29 UNT\original
[\\OORT\Media\Video-work\2017\Abril\29 UNT\original]ffmpeg -i "concat:MVI_7945.MOV|MVI_7946.MOV" -c copia p:MVI_7945-6.MOV
ffmpeg versión 3.2.4 Copyright (c) 2000-2017 los desarrolladores de FFmpeg
  construido con ⋯
[mov,mp4,m4a,3gp,3g2,mj2 @ 000000000256cae0] Se encontró un MOOV Atom duplicado. se lo saltó
Entrada #0, mov,mp4,m4a,3gp,3g2,mj2, desde 'concat:MVI_7945.MOV|MVI_7946.MOV':
  Metadatos:
    tiempo_de_creación: 2017-04-28T20:08:24.000000Z
    marca_principal: qt
    versión_menor: 537331968
    com.apple.quicktime.make: Canon
    com.apple.quicktime.modelo: Canon EOS 70D
    com.apple.quicktime.rating.usuario: 0.000000
    com.apple.quicktime.autor: John Dlugosz
    marcas_compatibles: qt CAEP
  Duración: 00:18:25.10, inicio: 0.000000, tasa de bits: 35549 kb/s
    Transmisión n.° 0:0(eng): Video: h264 (Alto) (avc1 / 0x31637661), yuvj420p(pc, bt709), 1920x1080 [SAR 1:1 DAR 16:9], 29460 kb/s, 23,98 fps, 23,98 tbr , 24k tbn, 48k tbc (predeterminado)
    Metadatos:
      tiempo_de_creación: 2017-04-28T20:08:24.000000Z
      código de tiempo: 22:39:33:15
    Transmisión n.º 0:1 (eng): Audio: pcm_s16le (sowt / 0x74776F73), 48000 Hz, estéreo, s16, 1536 kb/s (predeterminado)
    Metadatos:
      tiempo_de_creación: 2017-04-28T20:08:24.000000Z
      código de tiempo: 22:39:33:15
    Stream #0:2(eng): Datos: ninguno (tmcd / 0x64636D74), 0 kb/s (predeterminado)
    Metadatos:
      tiempo_de_creación: 2017-04-28T20:08:24.000000Z
      código de tiempo: 22:39:33:15
Salida #0, mov, a 'p:MVI_7945-6.MOV':
  Metadatos:
    marcas_compatibles: qt CAEP
    marca_principal: qt
    versión_menor: 537331968
    com.apple.quicktime.make: Canon
    com.apple.quicktime.modelo: Canon EOS 70D
    com.apple.quicktime.rating.usuario: 0.000000
    com.apple.quicktime.autor: John Dlugosz
    codificador: Lavf57.56.101
    Secuencia n.° 0:0(eng): Video: h264 (Alto) (avc1 / 0x31637661), yuvj420p(pc, bt709), 1920x1080 [SAR 1:1 DAR 16:9], q=2-31, 29460 kb/s , 23,98 fps, 23,98 tbr, 24k tbn, 24k tbc (predeterminado)
    Metadatos:
      tiempo_de_creación: 2017-04-28T20:08:24.000000Z
      código de tiempo: 22:39:33:15
    Transmisión n.º 0:1 (eng): Audio: pcm_s16le (sowt / 0x74776F73), 48000 Hz, estéreo, 1536 kb/s (predeterminado)
    Metadatos:
      tiempo_de_creación: 2017-04-28T20:08:24.000000Z
      código de tiempo: 22:39:33:15
Mapeo de flujo:
  Transmisión #0:0 -> #0:0 (copiar)
  Transmisión #0:1 -> #0:1 (copiar)
Presione [q] para detener, [?] para obtener ayuda
fotograma=26496 fps=519 q=-1,0 Lsize= 4181879kB tiempo=00:18:25,08 tasa de bits=31000,3 kbits/s velocidad=21,6x
video:3974174kB audio:207207kB subtítulo:0kB otros flujos:0kB encabezados globales:0kB sobrecarga muxing: 0.011905%

Respuestas (1)

El protocolo concat es la elección incorrecta para la mayoría de los formatos de archivo. Los flujos de transporte como MPEG-TS son uno de los pocos formatos que se pueden concatenar de esta manera. Todo lo que hace este método es una adición cruda de cada entrada a la entrada anterior. Por lo tanto, cualquier formato que tenga un elemento de metadatos no se puede concatenar de esta manera, ya que los metadatos de los otros archivos estarán en el medio del archivo de salida y los metadatos al frente del archivo no harán referencia a ellos.

Deberías usar el demuxer concat en su lugar. Crear un archivo de texto, es decir

file '/path/to/file1'
file '/path/to/file2'
file '/path/to/file3'

y entonces

ffmpeg -f concat -safe 0 -i mylist.txt -c copy output
Sí, sé cómo usar eso, está en la misma página a la que me vinculé.
Al volver a leer los documentos, tiene sentido después de su explicación. Sin embargo, es extraño que tenga un efecto diferente de "copia de flujo", y lo más preocupante es que no da ningún error, pero aparentemente sabe que no puede hacerlo, cambiando silenciosamente el comando a una copia inútil del primer archivo. .