Как добавить черные рамки и сохранить частоту кадров? - PullRequest
0 голосов
/ 03 марта 2020

У меня есть черное изображение, из которого я генерирую видео, заполненные черным цветом только для указанных длин, которые я могу затем объединить с моими видео назначения. Вот как я его создаю:

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 или установить желаемое значение?

1 Ответ

1 голос
/ 03 марта 2020

Все потоки видео в файлах в списке concat должны иметь одинаковую временную шкалу для поддержания исходной скорости воспроизведения.

Файл TS всегда имеет временную шкалу 90000 (90k 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...