0

I have a black image from which I generate videos filled with black color only for specified lengths that I can then concatenate with my destination videos. This is how I produce it:

ffmpeg -loop 1 -i black.png -t 00:00:00.066 \ 
    -c:v libx264 -pix_fmt yuv420p -vf scale=840:480,fps=15 out66ms.mp4

with the following ffmpeg output:

Input #0, png_pipe, from 'black.png':
  Duration: N/A, bitrate: N/A
    Stream #0:0: Video: png, rgba(pc), 608x342 [SAR 5669:5669 DAR 16:9], 25 fps, 25 tbr, 25 tbn, 25 tbc
Stream mapping:
  Stream #0:0 -> #0:0 (png (native) -> h264 (libx264))
Press [q] to stop, [?] for help
[libx264 @ 0x7fadf3826e00] using SAR=64/63
[libx264 @ 0x7fadf3826e00] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX FMA3 BMI2 AVX2
[libx264 @ 0x7fadf3826e00] profile High, level 3.0
[libx264 @ 0x7fadf3826e00] 264 - core 155 r2917 0a84d98 - H.264/MPEG-4 AVC codec - Copyleft 2003-2018 - http://www.videolan.org/x264.html - options: cabac=1 ref=3 deblock=1:0:0 analyse=0x3:0x113 me=hex subme=7 psy=1 psy_rd=1.00:0.00 mixed_ref=1 me_range=16 chroma_me=1 trellis=1 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=-2 threads=12 lookahead_threads=2 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=2 b_adapt=1 b_bias=0 direct=1 weightb=1 open_gop=0 weightp=2 keyint=250 keyint_min=15 scenecut=40 intra_refresh=0 rc_lookahead=40 rc=crf mbtree=1 crf=23.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00
Output #0, mp4, to 'out66ms.mp4':
  Metadata:
    encoder         : Lavf58.29.100
    Stream #0:0: Video: h264 (libx264) (avc1 / 0x31637661), yuv420p, 840x480 [SAR 64:63 DAR 16:9], q=-1--1, 15 fps, 15360 tbn, 15 tbc
    Metadata:
      encoder         : Lavc58.54.100 libx264
    Side data:
      cpb: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: -1
frame=    1 fps=0.0 q=27.0 Lsize=       2kB time=00:00:00.00 bitrate=201107.7kbits/s speed=0.0031x
video:1kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 100.984009%
[libx264 @ 0x7fadf3826e00] frame I:1     Avg QP:12.00  size:   123
[libx264 @ 0x7fadf3826e00] mb I  I16..4: 100.0%  0.0%  0.0%
[libx264 @ 0x7fadf3826e00] 8x8 transform intra:0.0%
[libx264 @ 0x7fadf3826e00] coded y,uvDC,uvAC intra: 0.0% 0.0% 0.0%
[libx264 @ 0x7fadf3826e00] i16 v,h,dc,p: 97%  0%  3%  0%
[libx264 @ 0x7fadf3826e00] i8c dc,h,v,p: 100%  0%  0%  0%
[libx264 @ 0x7fadf3826e00] kb/s:14.76

I'd like to then concatenate it with videos like this one:

ffprobe file.ts
Input #0, mpegts, from 'file.ts':
  Duration: 00:00:06.67, start: 0.000000, bitrate: 1090 kb/s
  Program 1
    Metadata:
      service_name    : Service01
      service_provider: FFmpeg
    Stream #0:0[0x100]: Video: h264 (Baseline) ([27][0][0][0] / 0x001B), yuv420p(progressive), 864x480, 90k tbr, 90k tbn, 180k tbc

but as soon as I concatenate it using concat demuxer like that:

ffmpeg -y -hide_banner \
    -f concat -safe 0 \
    -i <(echo "file '$PWD/out66ms.mp4'"; for f in dir/*.ts; do echo "file '$PWD/$f'"; done) \
    -c copy \
    output.mp

I get this:

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'output.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf58.29.100
  Duration: 00:01:41.38, start: 0.000000, bitrate: 170 kb/s
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 840x480 [SAR 64:63 DAR 16:9], 170 kb/s, 2.67 fps, 2.67 tbr, 15360 tbn, 30 tbc (default)
    Metadata:
      handler_name    : VideoHandler

Which has 2.67 fps whereas not adding this empty black video to concatenation gives the following (desired 15 fps):

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'output.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf58.29.100
  Duration: 00:00:17.29, start: 0.000000, bitrate: 1001 kb/s
    Stream #0:0(und): Video: h264 (Baseline) (avc1 / 0x31637661), yuv420p, 864x480, 999 kb/s, 15.62 fps, 15.58 tbr, 90k tbn, 180k tbc (default)
    Metadata:
      handler_name    : VideoHandler

EDIT

I've tried reencoding instead of copying:

ffmpeg -y -hide_banner \
    -f concat -safe 0 \
    -i <(echo "file '$PWD/out66ms.mp4'"; for f in dir/*.ts; do echo "file '$PWD/$f'"; done) \
    -c:v libx264 -vf scale=840:480,fps=15 \
    output.mp

But I get a similar result:

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'output.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf58.29.100
  Duration: 00:01:41.00, start: 0.000000, bitrate: 555 kb/s
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1680x480 [SAR 64:63 DAR 32:9], 554 kb/s, 15 fps, 15 tbr, 15360 tbn, 30 tbc (default)
    Metadata:
      handler_name    : VideoHandler

even though that the fps is set properly the video is too long and slowed down.

How to properly add those black filled videos to preserve fps or set it to desired value?

Patryk
  • 18,244
  • 37
  • 110
  • 212

1 Answers1

1

All videos streams in files in a concat list should have the same timescale to maintain original playback speed.

A TS file always has a timescale of 90000 (90k tbn). Your black video has a tbn of 15360. So, the timestamps after concat, no longer represent the original time intervals.

For MP4 output, use the -video_track_timescale option.

ffmpeg -loop 1 -i black.png -t 00:00:00.066 \ 
-c:v libx264 -pix_fmt yuv420p -vf scale=840:480,fps=15 -video_track_timescale 90000 out66ms.mp4
Gyan
  • 63,018
  • 7
  • 100
  • 141
  • Wow, seems like magic. Do you mind adding a bit more info about this? And one more thing: is there any chance to concatenate those files by copying to avoid transcoding? I can make this work with transcoding but when I do `-c copy` then I only get black video of the length of sum of those concatenated videos. – Patryk Mar 03 '20 at 13:27
  • For basic info about timescale, see https://stackoverflow.com/q/43333542. When streamcopying all video streams must have the same codec properties, including resolution. Although some players like VLC or Potplayer will be accommodating. – Gyan Mar 03 '20 at 13:55