6
votes

I have 2 video files that I want to concat using ffmpeg

initial.mp4 Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv), 720x720, 1077 kb/s, 15.98 fps, 16 tbr, 600 tbn, 1200 tbc (default)

ending.mp4 Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt470bg), 720x720 [SAR 1:1 DAR 1:1], 1287 kb/s, 25 fps, 25 tbr, 25k tbn, 50 tbc (default

video_instructions_with_ending.txt

file initial.mp4
file initial.mp4
file initial.mp4
file ending.mp4

FFmpeg command

ffmpeg -f concat -i video_instructions_with_ending.txt -c copy output.mp4 -y

output.mp4 Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv), 720x720, 27 kb/s, 0.43 fps, 48 tbr, 19200 tbn, 38400 tbc (default)

The output file is supposed to be 6 seconds. But the output file is 3min and 32 seconds.

Any help will be appreciated

For the files that I used, you can get it from:HERE

2
Please refer to this answer , I think this will your solution.Classsic

2 Answers

3
votes

I tried the following command and it worked for me

ffmpeg -i initial.mp4 -i initial.mp4 -i initial.mp4 -i ending.mp4 -filter_complex concat=n=4:v=1:a=0 -f MOV output.mp4 -y

Explanation: FFmpeg has three concat methods

  1. concat protocol (ffmpeg -i 'concat:input1|input2' -codec copy output). - use it for binary concat compatible files like avi, mpeg-ts files
  2. concat demuxer (the method you have explained) - use when you want to avoid a re-encode and your format does not support file level concatenation.
  3. concat filter: (the above answer) - use if you need to re-encode such as when applying filters.

The 3rd options fits the scenario, as we need to re-encode the files.

1
votes

Run this command on ending.mp4 and then concat with the new file:

ffmpeg -i ending.mp4 -c copy -video_track_timescale 600 newending.mp4

Long story short, timebases are different so the ending video is prolonged. See https://stackoverflow.com/a/43337235/5726027 for context on timestamps & bases.