1

I need to automate mp4 concatenation server-side and I'm using FFMPEG. I will get uploads of mp4 files and I want to attach a Title.mp4 and End.mp4 to each one. I am also overlaying a soundtrack (the input videos do not have sound) There is a potential high server load so I'd like to do it as efficiently as possible using ffmpeg's concat demuxer to avoid re-encoding the video.

After receiving samples of each file, I am not successful and I believe it is due to mismatched file formats. My result has good Title.mp4 and audio, then when the sample uploaded mp4 is supposed to play there is garbled green/pink/red pixels on the top half of the video, then the End.mp4 plays fine. Here is my ffmpeg command and output:

$ 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%

I can successfully concatenate the Title.mp4 to the End.mp4, and I can successfully concatenate two Sample.mp4 files, so I know I've got the ffmpeg command right. I can also successfully concat the files using the following ffmpeg command with filter_complex instead of concat demuxer (this takes considerably longer due to re-encoding):

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 

Here is the MediaInfo output for each type of mp4 file:

$ 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                           : Main@L3.1
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                           : Baseline@L3.1
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

I'm pretty sure it's the mp42 vs isom Codec ID's, and potentially the constant vs variable frame rates. I can't change the input mp4's but I know their format will stay the same. How can I reformat the Title and End mp4's to match the input mp4 files so I can use ffmpeg concat demux?

  • I have found a way to use ffmpeg to convert Title and End mp4's to use isom Codec ID (AVC Baseline) but concat demux still did not work ffmpeg -i Title.mp4 -profile:v baseline Title2.mp4 – user206481 Apr 11 '15 at 10:36
  • Also found a way to make the Title & End mp4 file variable frame rate but that did not fix concat demux either – user206481 Apr 11 '15 at 10:39
  • Found this comment in a FFMPEG user's forum somewhere: The concat demuxer can support variable frame rate, but it currently requires that all files have the same time base for the corresponding files So I am now researching timebases. – user206481 Apr 11 '15 at 10:42
  • You probably don't want to use the concat demuxer and stick to the concat filter. Else you're probably going to run into sync issues, and you'll save yourself the extra conversion step. – slhck Apr 13 '15 at 11:43
  • 1
    I did figure out I could use -video_track_timescale to get the tbn values to match up. That got rid of all the DTS errors but the resulting video still didn't work. Title & End cards displayed & music played, but in the middle the input video did not play. Have not found any way to get the tbc values to match. Tried using the settbs filter but it didn't seem to have an effect. – user206481 Apr 13 '15 at 12:14

Your Answer

By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.

Browse other questions tagged or ask your own question.