У меня есть черное изображение, из которого я генерирую видео, заполненные черным цветом только для указанных длин, которые я могу затем объединить с моими видео назначения. Вот как я его создаю:
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
со следующим выводом ffmpeg
:
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
Я хотел бы затем объединить его с видео, подобными этому:
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
но как только я конкатенирую его, используя concat demuxer , вот так:
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
Я получаю это:
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
Который имеет 2.67 fps
тогда как не добавление этого пустого черного видео в конкатенацию дает следующее (желательно 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
Я пробовал перекодировать вместо копирование:
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
Но я получаю аналогичный результат:
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
, даже если частота кадров установлена правильно, видео слишком длинное и замедлено.
Как правильно добавить эти черные видео, чтобы сохранить fps или установить желаемое значение?