我正在尝试实现 vp9 硬件加速编码过程。我遵循 ffmpeg 官方 github 的示例(此处 -> vaapi_encode.c)。
但给定的示例仅将 .yuv 文件保存到 .h264 文件,我想将帧保存到 .mp4 或 .webm 容器。并具有质量控制能力等。
我不是从文件中读取帧,而是从实时源中收集帧。当实时视频中有完整的 5 秒帧时,使用 vp9_vaapi 将这些帧编码为 5 秒 .mp4 文件。
我可以将实时直播中的所有 5 秒帧保存到 .mp4 或 .webm 文件中,但它们无法正确播放(更准确地说:继续加载,然后我打开)。
官方网站示例的结果:
cpu编码vp9 .mp4文件结果:
我正在尝试使用我的 LG OLED 电视的 ffmpeg 和 VAAPI 硬件加速将 4K HEVC HDR 视频转码为较低的比特率。
我使用以下文件: 视频
使用以下命令:
ffmpeg -init_hw_device vaapi=va:/dev/dri/renderD128 -hwaccel vaapi -hwaccel_output_format vaapi -hwaccel_device va -filter_hw_device va -i LG\ 4K\ HDR\ Demo\ -\ Daylight.mkv -map 0:0 -t 00:00:20 -c:v hevc_vaapi -sei hdr -qp:v 21 lg_vaapi.mkv
Run Code Online (Sandbox Code Playgroud)
但是这个文件在我的电视上没有被识别为 HDR。
使用 libx265 编码器(当然慢得多)时,它工作正常:
ffmpeg -i LG\ 4K\ HDR\ Demo\ -\ Daylight.mkv -t 00:00:20 -map 0:0 -c:v libx265 -preset medium -crf 18 -x265-params "colorprim=bt2020:colormatrix=bt2020nc:transfer=smpte2084:colormatrix=bt2020nc:hdr=1:info=1:repeat-headers=1:master-display=G(13250,34500)B(7500,3000)R(34000,16000)WP(15635,16450)L(11000000,40)" lg_libx265.mkv
Run Code Online (Sandbox Code Playgroud)
比较两个文件上 mediainfo 的输出时,我可以看到没有为视频轨道设置以下属性:
vaapi 编码的媒体信息:
General
Unique …
Run Code Online (Sandbox Code Playgroud) 设置是 Linux,ffmpeg 使用 kabylake iGPU。
我正在使用kmsgrab设备捕获正在运行的摇摆实例,这需要使用硬件后端在我的硬件上连贯地处理图像。只有 VA API 符合此要求。我想在编码过程中在右下角覆盖网络摄像头。然而,试图操纵过滤器图来实现这一点的尝试没有成功。这最终适用于 Twitch/Tube 流。
现在,我实际上是将网络摄像头捕获到 sdl 窗口,并使用单独的ffmpeg
. 这实际上并没有解决我的问题,因为窗口很容易被工作区切换或其他窗口伪装。
这是解决方法:
#!/usr/bin/env zsh
# record webcam and open it in sdl window
ffmpeg -v quiet -hide_banner \
-re -video_size 640X480 -hwaccel vaapi -vaapi_device /dev/dri/renderD128 -i /dev/video0 \
-vf 'format=nv12,hwupload' -c:v hevc_vaapi -f hevc - \
| ffmpeg -v quiet -i - -f sdl2 - &
# wait for webcam window to open
until swaymsg -t get_tree | grep 'pipe:' …
Run Code Online (Sandbox Code Playgroud) 我已从启用的ffmpeg
快照进行编译vaapi
。
$ ffmpeg -hwaccels
Hardware acceleration methods:
vaapi
Run Code Online (Sandbox Code Playgroud)
我对使用 GPU 可以执行的可用过滤图操作感到好奇,并找到了此文档页面
https://ffmpeg.org/ffmpeg-filters.html#toc-VAAPI-Video-Filters
此页面显示单个过滤器tonemap_vaapi
。我觉得很奇怪,只有一个过滤器,而不是tonemap
缩放之类的东西。
所以我运行了这个命令
$ ffmpeg -filters | grep vaapi
... deinterlace_vaapi V->V (null)
... denoise_vaapi V->V (null)
... procamp_vaapi V->V (null)
... scale_vaapi V->V (null)
... sharpness_vaapi V->V (null)
Run Code Online (Sandbox Code Playgroud)
它显示了更多我在任何地方都找不到记录的过滤器。这些没有记录是否有原因?我在哪里可以找到如何使用它们?此外,我注意到这tonemap_vaapi
不是可用的过滤器之一。
当我们讨论这个主题时,我真的希望有某种方法可以使用硬件加速来转置视频。我没有看到transpose_vaapi
过滤器,但我确实注意到这个线程https://patchwork.ffmpeg.org/project/ffmpeg/patch/20181225061644.6384-1-zachary.zhou@intel.com/,这个功能是否已添加到ffmpeg中或者为什么不是吗?有没有办法用 OpenCL 进行转置?我在这里没有看到任何提及在 OpenCL 过滤器下转置的内容 https://ffmpeg.org/ffmpeg-filters.html#OpenCL-Video-Filters
谢谢
编辑 -
我发现该文件ffmpeg/libavfilter/allfilters.c
列出了许多未记录的过滤器。
https://github.com/FFmpeg/FFmpeg/blob/master/libavfilter/allfilters.c
这如何transpose_vaapi
我已经看到了使用libavcodec和vaapi来加速解码的各种例子,但你如何使用它来加速编码呢?
我目前正在尝试在 FFMPEG 上使用 vaapi hwaccelleration。
在我的命令,我必须hwaccel
对vaapi
,hwaccel_output_fomrat
对vaapi
,-hwaccel_device
对/dev/dri/renderD128
,还有-vf
的format=nv12, hwupload
和视频编解码器-c:v
上h264_vaapi
。
当我现在尝试启动它时,出现错误
grep stderr: [hwupload @ 0x30bb660] A hardware deveice reference is required to upload frames to.
[Parsed_hwupload_1 @ 0x30bb560] Query format failed for 'Parsed_hwupload_1': Invalid argument
我可以在某处定义硬件设备引用吗?我认为这就是我所做的hwaccel_device
,但似乎不是。那么我该怎么做才能让它发挥作用?
我需要两个 gst-launch-1.0 命令行
1)第一个是简单的播放视频(.mp4)而不使用任何硬件加速。
2)第二个是使用硬件加速播放视频(.mp4),我使用的是带有i965驱动程序的英特尔高清显卡。
我已经安装了 gstreamer 插件。
任何帮助,将不胜感激。