FFMPEG concat demuxer: cómo hacer compatibles los formatos de archivo mp4

1

Necesito automatizar la concatenación mp4 del lado del servidor y estoy usando FFMPEG. Recibiré cargas de archivos mp4 y quiero adjuntar un Title.mp4 y End.mp4 a cada uno. También estoy superponiendo una banda sonora (los videos de entrada no tienen sonido). Existe una alta carga potencial del servidor, por lo que me gustaría hacerlo de la manera más eficiente posible utilizando el demuxer concat de ffmpeg para evitar volver a codificar el video.

Después de recibir muestras de cada archivo, no tengo éxito y creo que se debe a formatos de archivo no coincidentes. Mi resultado tiene un buen Título.mp4 y audio, luego, cuando se supone que la muestra cargada mp4 se reproduce, hay píxeles ilegibles verdes / rosados ​​/ rojos en la mitad superior del video, luego el End.mp4 funciona bien. Aquí está mi comando y salida ffmpeg:

$ ffmpeg -f concat -i <(printf "file '%s'\n" Title.mp4 Sample.mp4 End.mp4) -i SoundTrack.wav -c:v copy -strict -2 -y Out.mp4

ffmpeg version 2.6.1 Copyright (c) 2000-2015 the FFmpeg developers
built with gcc 4.1.2 (GCC) 20080704 (Red Hat 4.1.2-55)
configuration: --prefix=/home/dpmsmobi/ffmpeg_build --extra-cflags=-I/home/dpmsmobi/ffmpeg_build/include --extra-ldflags=-L/home/dpmsmobi/ffmpeg_build/lib --bindir=/home/dpmsmobi/bin --enable-gpl --enable-nonfree --enable-libmp3lame --enable-libvorbis --enable-libvpx --enable-libx264
  libavutil      54. 20.100 / 54. 20.100
  libavcodec     56. 26.100 / 56. 26.100
  libavformat    56. 25.101 / 56. 25.101
  libavdevice    56.  4.100 / 56.  4.100
  libavfilter     5. 11.102 /  5. 11.102
  libswscale      3.  1.101 /  3.  1.101
  libswresample   1.  1.100 /  1.  1.100
  libpostproc    53.  3.100 / 53.  3.100
Input #0, concat, from '/dev/fd/63':
  Duration: N/A, start: 0.000000, bitrate: 1810 kb/s
    Stream #0:0: Video: h264 (Main) (avc1 / 0x31637661), yuv420p(tv), 768x512 [SAR 1:1 DAR 3:2], 1810 kb/s, 30 fps, 30 tbr, 30k tbn, 60 tbc
Guessed Channel Layout for  Input Stream #1.0 : stereo
Input #1, wav, from 'SoundTrack.wav':
  Metadata:
    encoded_by      : Adobe Premiere Pro CC 2014 (Maci
    encoder         : Adobe Premiere Pro CC 2014 (Macintosh)
    date            : 2015-04-07
    creation_time   : 11:12:10
    time_reference  : 0
  Duration: 00:00:15.06, bitrate: 1551 kb/s
    Stream #1:0: Audio: pcm_s16le ([1][0][0][0] / 0x0001), 48000 Hz, 2 channels, s16, 1536 kb/s
Output #0, mp4, to 'Out.mp4':
  Metadata:
    encoder         : Lavf56.25.101
    Stream #0:0: Video: h264 ([33][0][0][0] / 0x0021), yuv420p, 768x512 [SAR 1:1 DAR 3:2], q=2-31, 1810 kb/s, 30 fps, 30 tbr, 30k tbn, 30k tbc
    Stream #0:1: Audio: aac ([64][0][0][0] / 0x0040), 48000 Hz, stereo, fltp, 128 kb/s
    Metadata:
      encoder         : Lavc56.26.100 aac
Stream mapping:
  Stream #0:0 -> #0:0 (copy)
  Stream #1:0 -> #0:1 (pcm_s16le (native) -> aac (native))
Press [q] to stop, [?] for help
[concat @ 0x1dedc20] Thread message queue blocking; consider raising the thread_queue_size option (current value: 8)
[concat @ 0x1dedc20] DTS 69750 < 91000 out of order
[mp4 @ 0x1f75060] Non-monotonous DTS in output stream 0:0; previous: 91000, current: 69750; changing to 91001. This may result in incorrect timestamps in the output file.

<----- many more Non-monotonous DTS messages omitted here ---->

frame=  427 fps=0.0 q=-1.0 Lsize=    4123kB time=00:00:15.06 bitrate=2242.5kbits/s    
video:3873kB audio:236kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.344173%

Puedo concatenar con éxito el Title.mp4 al End.mp4, y puedo concatenar con éxito dos archivos Sample.mp4, así que sé que tengo el comando ffmpeg correcto. También puedo concatenar con éxito los archivos usando el siguiente comando ffmpeg con filter_complex en lugar de concat demuxer (esto lleva mucho más tiempo debido a la nueva codificación):

ffmpeg -i Title.mp4 -i Sample.mp4 -i End.mp4 -i SoundTrack.wav -filter_complex '[0:0] [1:0] [2:0] concat=n=3:v=1 [v]' -map '[v]' -map 3:0 -crf 20 -strict -2 -y Out2.mp4 

Aquí está la salida de MediaInfo para cada tipo de archivo mp4:

$ mediainfo Title.mp4
General
Complete name                            : Title.mp4
Format                                   : MPEG-4
Format profile                           : Base Media / Version 2
Codec ID                                 : mp42
File size                                : 693 KiB
Duration                                 : 3s 100ms
Overall bit rate mode                    : Variable
Overall bit rate                         : 1 831 Kbps
Encoded date                             : UTC 2015-04-07 19:15:03
Tagged date                              : UTC 2015-04-07 19:15:03
©TIM                                     : 00:00:00:00
©TSC                                     : 30
©TSZ                                     : 1

Video
ID                                       : 1
Format                                   : AVC
Format/Info                              : Advanced Video Codec
Format profile                           : [email protected]
Format settings, CABAC                   : Yes
Format settings, ReFrames                : 3 frames
Codec ID                                 : avc1
Codec ID/Info                            : Advanced Video Coding
Duration                                 : 3s 100ms
Bit rate mode                            : Variable
Bit rate                                 : 1 811 Kbps
Maximum bit rate                         : 3 000 Kbps
Width                                    : 768 pixels
Height                                   : 512 pixels
Display aspect ratio                     : 3:2
Frame rate mode                          : Constant
Frame rate                               : 30.000 fps
Standard                                 : NTSC
Color space                              : YUV
Chroma subsampling                       : 4:2:0
Bit depth                                : 8 bits
Scan type                                : Progressive
Bits/(Pixel*Frame)                       : 0.154
Stream size                              : 685 KiB (99%)
Language                                 : English
Encoded date                             : UTC 2015-04-07 19:15:03
Tagged date                              : UTC 2015-04-07 19:15:03
Color range                              : Limited

$ mediainfo Sample.mp4
General
Complete name                            : Sample.mp4
Format                                   : MPEG-4
Format profile                           : Base Media
Codec ID                                 : isom
File size                                : 2.93 MiB
Duration                                 : 7s 9ms
Overall bit rate                         : 3 505 Kbps
Encoded date                             : UTC 1970-01-01 00:00:00
Tagged date                              : UTC 1970-01-01 00:00:00
Writing application                      : Lavf52.64.2

Video
ID                                       : 1
Format                                   : AVC
Format/Info                              : Advanced Video Codec
Format profile                           : [email protected]
Format settings, CABAC                   : No
Format settings, ReFrames                : 1 frame
Format settings, GOP                     : M=1, N=30
Codec ID                                 : avc1
Codec ID/Info                            : Advanced Video Coding
Duration                                 : 7s 9ms
Bit rate                                 : 3 500 Kbps
Width                                    : 768 pixels
Height                                   : 512 pixels
Display aspect ratio                     : 3:2
Frame rate mode                          : Variable
Frame rate                               : 30.250 fps
Minimum frame rate                       : 23.462 fps
Maximum frame rate                       : 296.053 fps
Color space                              : YUV
Chroma subsampling                       : 4:2:0
Bit depth                                : 8 bits
Scan type                                : Progressive
Bits/(Pixel*Frame)                       : 0.294
Stream size                              : 2.92 MiB (100%)
Language                                 : English
Encoded date                             : UTC 1970-01-01 00:00:00
Tagged date                              : UTC 1970-01-01 00:00:00

Estoy bastante seguro de que es el ID del códec mp42 vs isom, y potencialmente las tasas de fotogramas constantes vs variables. No puedo cambiar los mp4 de entrada, pero sé que su formato seguirá siendo el mismo. ¿Cómo puedo formatear el Título y Fin de mp4 para que coincida con los archivos de entrada mp4 para poder usar ffmpeg concat demux?

usuario206481
fuente
He encontrado una manera de usar ffmpeg para convertir el título y el final de mp4 para usar el ID de códec isom (AVC Baseline) pero concat demux aún no funcionaba ffmpeg -i Title.mp4 -profile:v baseline Title2.mp4
user206481
También encontré una manera de hacer que la velocidad de fotogramas variable del archivo Título y Fin mp4 fuera variable, pero eso tampoco solucionó el problema concat demux
user206481
Encontré este comentario en el foro de un usuario de FFMPEG en alguna parte: el demuxer concat puede admitir una velocidad de fotogramas variable, pero actualmente requiere que todos los archivos tengan la misma base de tiempo para los archivos correspondientes. Por lo tanto, ahora estoy investigando las bases de tiempo.
user206481
Probablemente no desee usar el demuxer concat y apegarse al filtro concat. De lo contrario, es probable que tenga problemas de sincronización y se ahorrará el paso de conversión adicional.
slhck
1
Me di cuenta de que podía usar -video_track_timescale para obtener los valores de tbn para que coincidan. Eso eliminó todos los errores DTS, pero el video resultante aún no funcionó. Se muestran tarjetas de título y final y se reproduce música, pero en el medio no se reproduce el video de entrada. No he encontrado ninguna forma de hacer coincidir los valores de TBC. Intenté usar el filtro settbs pero no pareció tener efecto.
user206481