首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么python中的pyav包不能识别h264_cuvid编解码器,而ffmpeg可以这样做呢?

为什么python中的pyav包不能识别h264_cuvid编解码器,而ffmpeg可以这样做呢?
EN

Stack Overflow用户
提问于 2022-03-25 14:20:26
回答 2查看 506关注 0票数 0

我有一个从视频中读取byte_stream的python脚本,如下所示。我想使用h264_cuvid代码来完成GPU硬件加速,而不是使用CPU的编码或解码。当我运行以下命令时,我的FFmpeg确实有h264_cuvid代码:

代码语言:javascript
运行
复制
ffmpeg -c:v h264_cuvid -i input.mp4 output_codec.mp4

当我尝试创建一个h264_cuvid编解码器时,它成功地运行,但在pyav包中,如下所示:

代码语言:javascript
运行
复制
import av

video = av.open(VIDEO_FILE_PATH)
target_stream = video.streams.video[0]
ctx = av.Codec('h264_cuvid', 'r').create()

它给了我一个错误,上面写着一个未知的编解码器:

代码语言:javascript
运行
复制
ctx = av.Codec('h264_cuvid', 'r').create()
File "av/codec/codec.pyx", line 184, in av.codec.codec.Codec.__cinit__
File "av/codec/codec.pyx", line 193, in av.codec.codec.Codec._init
av.codec.codec.UnknownCodecError: h264_cuvid
代码语言:javascript
运行
复制
av version = 9.0.2

ffmpeg version 7:3.4.8-0ubuntu0.2

注意:我通过pip install av安装了av

如能提供任何帮助,将不胜感激。

EN

回答 2

Stack Overflow用户

发布于 2022-04-22 13:30:45

除非您从源代码中编译pyAV,否则它将使用不支持硬件加速的ffmpeg版本进行预编译。这样做有两个原因:(1)更好的设备兼容性,(2)维护效率。

人们通常会引用三个使用hwaccel的主要原因:(1)更快的编码,(2)更快的解码,或(3)更好的能源效率。关于(1),硬件编码器在实际中倾向于产生比软件编码器更低质量的视频(比特率相等)。关于(2),硬件解码器确实比软件解码器更快,但必须将帧复制回主机内存(RAM),以便将其提供给python层。这将减少或抵消任何速度增益。关于(3),如果您追求能源效率,那么切换到编译语言将是一个比引入hwaccel更好的优化。

反对hwaccel的主要原因是:它很难实现,而且很脆弱,所以您不仅需要一个非常有才华的人来编写初始代码,而且您还需要一个同样有能力的人,在hwaccel发生变化(它不是最稳定的)或有but或新特性需要添加时,自愿维护它并修复它。

因此,总之,在pyav中不支持它的主要原因是因为它被认为没有足够的影响,更重要的是因为没有人愿意维护它,也就是说,维护效率不支持它。

票数 0
EN

Stack Overflow用户

发布于 2022-05-03 16:06:47

我回答了我自己的问题,因为我找到了解决办法。为了在pyav中使用硬件加速,您需要编译ffmpeg,然后从源安装pyav (不使用pyav)。此外,还必须将系统的cuda路径设置为bashrc文件。

这个bashscript帮助您完成所有步骤:

代码语言:javascript
运行
复制
echo "************************  try building ffmpeg  *******************"
echo "Install nv-codec-headers"

git clone https://git.videolan.org/git/ffmpeg/nv-codec-headers.git

cd nv-codec-headers && make -j4 && make install && cd ..

wget https://ffmpeg.org/releases/ffmpeg-4.2.1.tar.bz2
tar -xf ffmpeg-4.2.1.tar.bz2
cd ffmpeg-4.2.1
./configure --enable-cuda --enable-cuvid --enable-nvenc --enable-nonfree --extra-cflags=-I/usr/local/cuda/include --extra-ldflags=-L/usr/local/cuda/lib64 --enable-shared

make -j4
make install
cd ..

echo "************************  setting cuda path  *******************"
echo "export PATH=/usr/local/cuda/bin:/ffmpeg/libavdevice:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin" >> ~/.bashrc
echo "export LD_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu:/usr/local/cuda/targets/x86_64-linux/lib:/usr/local/cuda/targets/x86_64-linux/include:/usr/local/cuda/lib64:/usr/local/cuda/include:/usr/local/cuda/extras/CUPTI/lib64:/ffmpeg/libavdevice" >> ~/.bashrc

echo "************************  try building pyav  *******************"
git clone -b hwaccel https://github.com/rvillalba-novetta/PyAV.git

cd PyAV
source scripts/activate.sh
pip3 install -r tests/requirements.txt
make -j4

python3 setup.py install
cd ..

ldconfig /usr/local/cuda/lib64
echo "*********************   ffmpeg and pyav are built successfuly ***************"
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71618462

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档