如何添加黑框并保持帧速率?

问题描述 投票:0回答:1

我有一个黑色图像,从中生成的视频仅填充了指定长度的黑色,然后可以将其与目标视频连接起来。这是我的生产方式:

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

编辑

我尝试重新编码而不是复制:

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,视频也太长且速度变慢。

如何正确添加那些黑色填充的视频以保持fps或将其设置为所需的值?

ffmpeg
1个回答
1
投票

concat列表中文件中的所有视频流应具有相同的时标,以保持原始播放速度。

TS文件始终具有90000(90k tbn)的时标。黑色视频的tbn为15360。因此,concat之后的时间戳不再代表原始时间间隔。

对于MP4输出,请使用-video_track_timescale选项。

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
© www.soinside.com 2019 - 2024. All rights reserved.