大家好,又见面了,我是你们的朋友全栈君。
本文 以 ffmpeg-4.4 源码为准,a.mp4下载链接:百度网盘,提取码:nl0s 。
FFplay 硬件解码命令如下:
代码语言:javascript复制ffplay.exe -vcodec h264_cuvid -i a.mp4
上面命令指定了 NVIDIA 的 硬件解码器,h264_cuvid
。 在 ffplay.c 的代码里面 硬件解码 跟 普通解码在逻辑上没有做什么特殊的处理。
ffplay.c
里面没有像 ffmpeg.c
那样支持 -hwaccel
这个选项,所以 ffplay.c 的硬件解码流程 跟 普通解码 流程没有区别,至少在 API 函数使用上是这样。
断点查看可以看到,就是 传递一个 解码器名称 进行 avcodec_open2()
函数里面。
使用 ffplay 进行硬件解码的时候,GPU 的性能监控图如下,可以看到,占用率非常低。
ffplay 跟 ffmpeg 解码的时候不一样,这是因为 ffplay 只需要按照帧率去解码即可,ffplay 是播放多少,解码多少。而 ffmpeg 是解码得越快越好。所以 ffmpeg 硬件解码 占用的 gpu 资源会很高,ffmpeg 可以通过 -re
参数控制解码速度。
还有一个地方,ffplay 不支持 -hwaccel
这个选项。
-hwaccel
这个选项 应该是 控制 GPU 进行并行计算的,因为在显卡里,并行计算跟编解码器是两个模块(这个我也不太清楚,知道的朋友可以在文章评论补充一下)
分析完毕
由于笔者的水平有限, 加之编写的同时还要参与开发工作,文中难免会出现一些错误或者不准确的地方,恳请读者批评指正。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/149047.html原文链接:https://javaforall.cn