本教程是关于https://pytorch.org/audio/main/hw_acceleration_tutorial.html,的硬件加速gpu编码/解码的,下面的代码出现了一个错误:
import torch
import torchaudio
print(torch.__version__) # 1.14.0.dev20221013+cu116
print(torchaudio.__version__) # 0.13.0.dev20221013+cu116
print(torchaudio._extension._FFMPEG_INITIALIZED) # True
from torchaudio.io import StreamReader
local_src = "vid.mp4"
cuda_conf = {
"decoder": "h264_cuvid", # Use CUDA HW decoder
"hw_accel": "cuda:0", # Then keep the memory on CUDA:0
}
def decode_vid(src, config):
frames = []
s = StreamReader(src)
s.add_video_stream(5, **config)
for i, (chunk,) in enumerate(s.stream()):
frames.append(chunk[0])
if __name__ == "__main__":
vid = decode_vid(local_src, cuda_conf)错误消息(略为截断)是:
文件"/home/james/PycharmProjects/AlphaPose/Spectronix/Early_Experiments/vid_gpu_decode.py",第23行,在decode_vid s.add_video_stream(5,*config)文件"/home/james/anaconda3/envs/alphapose/lib/python3.7/site-packages/torchaudio/io/_stream_reader.py",第624行中,在add_video_stream hw_accel中,RuntimeError:不支持的编解码器:"h264_cuvid“。
我有一个RTX3090ti作为我的GPU,它确实支持h264_cuvid解码器,而且我已经能够在运行的命令行上解码一个视频(取自上面链接的教程)。
sudo ffmpeg -hide_banner -y -vsync 0 -hwaccel cuvid -hwaccel_output_format cuda -c:v h264_cuvid -i "https://download.pytorch.org/torchaudio/tutorial-assets/stream-api/NASAs_Most_Scientifically_Complex_Space_Observatory_Requires_Precision-MP4_small.mp4" -c:a copy -c:v h264_nvenc -b:v 5M test.mp4因此,torchaudio.io似乎没有正确地使用ffmpeg。任何关于如何解决这个问题的见解都是值得赞赏的。我用的是Ubuntu 22.04。
发布于 2022-10-20 14:39:10
RuntimeError: Unsupported codec: "h264_cuvid".
错误发生在这里,而StreamReader还没有执行特定于NVDEC的代码,所以这是FFmpeg兼容性的一般问题。
这表明在运行时找到的libavcodec不是用h264_cuvid配置的。
一个可能的解释是,您的系统中有多个FFmpeg安装,torchaudio正在获取没有NVDEC支持的安装,而当您调用ffmpeg命令时,加载具有NVDEC支持的ffmpeg命令。
也许您可以检查您的系统,看看是否有多个FFmpeg安装,并删除那些没有NVDEC支持的?
发布于 2022-10-14 17:10:39
如果您不使用torchaudio (它的限制必须完全取决于包装器函数的工作方式),您可以尝试我的套餐来执行类似的函数。
pip install ffmpegio您可以只读取一次视频帧(捕获所有帧直到FFmpeg退出),或者在FFmpeg运行时一次读取一个块。
from ffmpegio
local_src = "vid.mp4"
kwargs = {
'vsync': 0,
'hwaccel_in': 'cuvid' # pick one or
# 'c:v_in': h264_cuvid # the other
}
# to read all the frames RGB
fs, F = ffmpegio.video.read(local_src, **kwargs)
# fs: framerate in frames/sec
# F: nframes x height x width x ncomp numpy array
# read n frames
n = 10
fs, F = ffmpegio.video.read(local_src, vframes=n, **kwargs)
# F: n x height x width x ncomp numpy array
# work on n frames at a time
with ffmpegio.open(local_src, blocksize=n, **kwargs) as f:
for F in f:
# F: n x height x width x ncomp numpy array有一点我不确定你的代码是
"hw_accel": "cuda:0", # Then keep the memory on CUDA:0据我所知,没有一种方法可以让外部程序访问映射到FFmpeg的CUDA内存空间。ffmpegio无法做到这一点。
如果您遇到任何问题,请随时在GitHub上发布。
https://stackoverflow.com/questions/74063722
复制相似问题