我有一个从视频中读取byte_stream的python脚本,如下所示。我想使用h264_cuvid代码来完成GPU硬件加速,而不是使用CPU的编码或解码。当我运行以下命令时,我的FFmpeg确实有h264_cuvid代码:
ffmpeg -c:v h264_cuvid -i input.mp4 output_codec.mp4
当我尝试创建一个h264_cuvid编解码器时,它成功地运行,但在pyav包中,如下所示:
import av
video = av.open(VIDEO_FILE_PATH)
target_stream = video.streams.video[0]
ctx = av.Codec('h264_cuvid', 'r').create()
它给了我一个错误,上面写着一个未知的编解码器:
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
av version = 9.0.2
ffmpeg version 7:3.4.8-0ubuntu0.2
注意:我通过pip install av
安装了av
如能提供任何帮助,将不胜感激。
发布于 2022-04-22 13:30:45
除非您从源代码中编译pyAV,否则它将使用不支持硬件加速的ffmpeg版本进行预编译。这样做有两个原因:(1)更好的设备兼容性,(2)维护效率。
人们通常会引用三个使用hwaccel的主要原因:(1)更快的编码,(2)更快的解码,或(3)更好的能源效率。关于(1),硬件编码器在实际中倾向于产生比软件编码器更低质量的视频(比特率相等)。关于(2),硬件解码器确实比软件解码器更快,但必须将帧复制回主机内存(RAM),以便将其提供给python层。这将减少或抵消任何速度增益。关于(3),如果您追求能源效率,那么切换到编译语言将是一个比引入hwaccel更好的优化。
反对hwaccel的主要原因是:它很难实现,而且很脆弱,所以您不仅需要一个非常有才华的人来编写初始代码,而且您还需要一个同样有能力的人,在hwaccel发生变化(它不是最稳定的)或有but或新特性需要添加时,自愿维护它并修复它。
因此,总之,在pyav中不支持它的主要原因是因为它被认为没有足够的影响,更重要的是因为没有人愿意维护它,也就是说,维护效率不支持它。
发布于 2022-05-03 16:06:47
我回答了我自己的问题,因为我找到了解决办法。为了在pyav中使用硬件加速,您需要编译ffmpeg,然后从源安装pyav (不使用pyav)。此外,还必须将系统的cuda路径设置为bashrc文件。
这个bashscript帮助您完成所有步骤:
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 ***************"
https://stackoverflow.com/questions/71618462
复制相似问题