首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >torchaudio.io未正确使用ffmpeg

torchaudio.io未正确使用ffmpeg
EN

Stack Overflow用户
提问于 2022-10-14 02:34:48
回答 2查看 269关注 0票数 -1

本教程是关于https://pytorch.org/audio/main/hw_acceleration_tutorial.html,的硬件加速gpu编码/解码的,下面的代码出现了一个错误:

代码语言:javascript
复制
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解码器,而且我已经能够在运行的命令行上解码一个视频(取自上面链接的教程)。

代码语言:javascript
复制
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。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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支持的?

票数 1
EN

Stack Overflow用户

发布于 2022-10-14 17:10:39

如果您不使用torchaudio (它的限制必须完全取决于包装器函数的工作方式),您可以尝试我的套餐来执行类似的函数。

代码语言:javascript
复制
pip install ffmpegio

您可以只读取一次视频帧(捕获所有帧直到FFmpeg退出),或者在FFmpeg运行时一次读取一个块。

代码语言:javascript
复制
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

有一点我不确定你的代码是

代码语言:javascript
复制
    "hw_accel": "cuda:0",  # Then keep the memory on CUDA:0

据我所知,没有一种方法可以让外部程序访问映射到FFmpeg的CUDA内存空间。ffmpegio无法做到这一点。

如果您遇到任何问题,请随时在GitHub上发布。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74063722

复制
相关文章

相似问题

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