Encoding (FFmpeg)从给定的官方FFmpeg示例将VP9 Vaapi编码为.mp4或.webm容器

Encoding (FFmpeg)从给定的官方FFmpeg示例将VP9 Vaapi编码为.mp4或.webm容器,encoding,ffmpeg,mp4,hardware-acceleration,vaapi,Encoding,Ffmpeg,Mp4,Hardware Acceleration,Vaapi,我正在尝试实现vp9硬件加速编码过程。我遵循了ffmpeg Official github的示例() 但给出的示例仅将.yuv文件保存到.h264文件,我希望将帧保存到.mp4或.webm容器中。具有质量控制能力等 我不是从文件中读取帧,而是从实时提要中收集帧。当从live feed获得完整的5秒帧时,使用vp9_vaapi将这些帧编码为5秒.mp4文件 我可以将live feed中的所有5秒帧保存到.mp4或.webm文件中,但无法正确播放(更准确地说:继续加载,然后打开) 官方网站示例的结果

我正在尝试实现vp9硬件加速编码过程。我遵循了ffmpeg Official github的示例()

但给出的示例仅将.yuv文件保存到.h264文件,我希望将帧保存到.mp4或.webm容器中。具有质量控制能力等

我不是从文件中读取帧,而是从实时提要中收集帧。当从live feed获得完整的5秒帧时,使用vp9_vaapi将这些帧编码为5秒.mp4文件

我可以将live feed中的所有5秒帧保存到.mp4或.webm文件中,但无法正确播放(更准确地说:继续加载,然后打开)

官方网站示例的结果如下:

cpu编码的vp9.mp4文件结果:

编辑: 结果

您需要直接使用FFmpeg,如果在
vp9\u vaapi
编码器中启用B帧,您可以选择在同一命令行中添加和

示例:

ffmpeg-threads 4-vaapi_设备/dev/dri/render128\
-hwaccel vaapi-hwaccel_输出_格式vaapi\
-我http://server:port \
-c:v vp9_vaapi-全球质量50-高炉1\
-bsf:vp9_原始_重新排序,vp9_超帧\
-f段-段时间5-段格式选项movflags=+快速启动输出%03d.mp4
根据需要调整输入和输出路径/URL

此命令的作用:

它将通过创建5秒长的mp4段。 请参阅
movflags=+faststart
的用法,以及如何通过上面的
-segment\u format\u options
标志将其作为格式选项传递给底层mp4复用器

分段长度可能不精确为5秒,因为每个分段都从一个关键帧开始(切割)

但是,我不建议在该编码器中启用B帧,因为这些比特流过滤器具有其他不希望的效果,例如和。这在生产环境中是不可取的。这就是为什么下面的脚本没有启用该选项,相反,我们直接在编码器选项中定义一个设置速率控制模式

如果需要利用VAAPI的1:N编码,请使用以下代码段:

  • 如果需要逐行扫描,请调用
    逐行扫描\u vaapi
    过滤器:
  • ffmpeg-logleveldebug-threads 4\
    -初始化硬件设备vaapi=va:/dev/dri/render128-hwaccel vaapi\
    -hwaccel_设备va-过滤器_hw_设备va\
    -hwaccel_输出_格式vaapi\
    -我http://server:port' \
    -过滤复合物“[0:v]去隔行,分离=3[n0][n1][n2]\
    [n0]标度=1152:648[v0]\
    [n1]比例尺=848:480[v1];
    [n2]比例_vaapi=640:360[v2]”\
    -b:v:0 2250k-最大速率:v:0 2250k-尺寸:v:0 360k-c:v:0 vp9_vaapi-g:v:0 50-r:v:0 25-rc_模式:v:0 2\
    -b:v:11750K-最大速率:v:11750K-尺寸:v:1280K-c:v:1VP9_vaapi-g:v:150R:v:125RC_模式:v:12\
    -b:v:2 1000k-最大速率:v:2 1000k-尺寸:v:2 160k-c:v:2 vp9_vaapi-g:v:2 50-r:v:2 25-rc_模式:v:2 2 2\
    -c:a aac-b:a 128k-ar 48000-ac 2\
    -标志-全局标题-f T形三通-使用fifo 1\
    -映射“[v0]”-映射“[v1]”-映射“[v2]”-映射0:a\
    “[select=\'v:0,a\':f=段:段\时间=5:段\格式\选项=movflags=+faststart]$output\路径0/输出%03d.mp4”\
    [选择=\'v:1,a\':f=段:段\u时间=5:段\u格式\u选项=movflags=+faststart]$output\u path1/output%03d.mp4 |\
    [选择=\'v:2,a\':f=段:段\u时间=5:段\u格式\u选项=movflags=+faststart]$output\u路径2/输出%03d.mp4”
    
  • 不进行逐行扫描:
  • ffmpeg-logleveldebug-threads 4\
    -初始化硬件设备vaapi=va:/dev/dri/render128-hwaccel vaapi\
    -hwaccel_设备va-过滤器hw_设备va-hwaccel_输出格式vaapi\
    -我http://server:port' \
    -过滤复合物“[0:v]分裂=3[n0][n1][n2]\
    [n0]标度=1152:648[v0]\
    [n1]比例尺=848:480[v1];
    [n2]比例_vaapi=640:360[v2]”\
    -b:v:0 2250k-最大速率:v:0 2250k-尺寸:v:0 2250k-c:v:0 vp9_vaapi-g:v:0 50-r:v:0 25-rc_模式:v:0 2\
    -b:v:11750K-最大速率:v:11750K-尺寸:v:11750K-c:v:1VP9_vaapi-g:v:150R:v:125RC_模式:v:12\
    -b:v:2 1000k-最大速率:v:2 1000k-尺寸:v:2 1000k-c:v:2 vp9_vaapi-g:v:2 50-r:v:2 25-rc_模式:v:2 2\
    -c:a aac-b:a 128k-ar 48000-ac 2\
    -标志-全局标题-f T形三通-使用fifo 1\
    -映射“[v0]”-映射“[v1]”-映射“[v2]”-映射0:a\
    “[select=\'v:0,a\':f=段:段\时间=5:段\格式\选项=movflags=+faststart]$output\路径0/输出%03d.mp4”\
    [选择=\'v:1,a\':f=段:段\u时间=5:段\u格式\u选项=movflags=+faststart]$output\u path1/output%03d.mp4 |\
    [选择=\'v:2,a\':f=段:段\u时间=5:段\u格式\u选项=movflags=+faststart]$output\u路径2/输出%03d.mp4”
    
  • 使用Intel的QuickSync(在受支持的平台上):
  • 在“英特尔Icelake”及更高版本上,您可以使用
    VP9QSV
    编码器包装器,但存在以下已知限制(目前):

    (a) 。您必须启用
    low_power mode
    ,因为
    iHD
    驱动程序目前只显示VDENC解码路径

    (b) 。MSDK不支持编码选项1和额外数据

    (c) 。默认情况下,IVF头将插入MSDK中,但FFmpeg不需要该头,并且在默认情况下保持禁用状态

    请参见以下示例:

  • 如果需要取消交错,请调用
    vpp\u qsv
    过滤器:
  • ffmpeg-nosdin-y-fflags+genpts\
    -初始化硬件设备vaapi=va:/dev/dri/render128,驱动程序=iHD\
    -过滤器硬件设备va-hwaccel vaapi-hwaccel输出格式vaapi
    -线程4-vsync 1-异步1\
    -我http://server:port' \
    -过滤复杂“[0:v]hwmap=deriver\u device=qsv,format=qsv,vpp\u qsv=deinterlace=2:async\u depth=4,拆分[n0][n1][n2]\
    [n0]vpp_qsv=w=1152:h=648:async_depth=4[v0]\
    [n1]vpp_qsv=w=848:h=480:async_depth=4[v1];
    [n2]vpp_qsv=w=640:h=36