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?