【问题标题】:torchaudio.io not properly using ffmpegtorchaudio.io 没有正确使用 ffmpeg
【发布时间】:2022-10-20 22:39:10
【问题描述】:

我正在关注本教程关于 PyTorch 的硬件加速 gpu 编码/解码 [https://pytorch.org/audio/main/hw_acceleration_tutorial.html],我遇到以下代码错误:

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”。

我有一个 RTX 3090 ti 作为我的 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。

【问题讨论】:

  • chunk的格式是什么?它可以是numpy数组吗?
  • 最终我想要一个 np 数组,是的,这就是块返回的内容。

标签: ffmpeg pytorch


【解决方案1】:

如果您可以离开torchaudio(它的限制必须纯粹是由于包装器功能的工作方式),您可以尝试我的ffmpegio package 来执行类似的功能。

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 上发布。

【讨论】:

  • 我不喜欢使用 torchaudio,尽管正如你所说,他们似乎确实能够将输出映射到给定的 gpu,并且由于我有一个多 gpu 设置,我想利用解码可能更多超过一个 gpu。我会在接下来的几天里尝试你的方法并让你知道,谢谢你的帮助。
  • 明白了。如果这就是您的意思,请将"hwaccel_in": "cuda:0" 设置为kwargs
【解决方案2】:

RuntimeError: Unsupported codec: "h264_cuvid".

错误发生在here,并且 StreamReader 还没有到达执行 NVDEC 特定代码的地步,所以这是 FFmpeg 兼容性的一般问题。

这表明在运行时找到的libavcodec 没有配置h264_cuvid

一种可能的解释是,您的系统中有多个 FFmpeg 安装,而 torchaudio 会选择不支持 NVDEC 的那个,而当您调用 ffmpeg 命令时,会加载支持 NVDEC 的那个。

也许您可以检查您的系统,看看是否有多个 FFmpeg 安装并删除不支持 NVDEC 的那些?

【讨论】:

    猜你喜欢
    • 2013-03-08
    • 2020-08-26
    • 1970-01-01
    • 1970-01-01
    • 2017-09-22
    • 2015-05-11
    • 1970-01-01
    • 1970-01-01
    • 2019-06-20
    相关资源
    最近更新 更多