FFmpeg av_hwdevice_ctx_create returns ENOMEM
FFmpeg av_hwdevice_ctx_create returns ENOMEM
我正在尝试使用 ffmpeg 的 vaapi 库在 GPU 上执行 h264 视频编码。
我一直在关注来自 ffmpeg Github 存储库的这个 example。
这里对我来说失败了:
AVBufferRef* vaapi_encoder;
int err = av_hwdevice_ctx_create(&vaapi_encoder, AV_HWDEVICE_TYPE_VAAPI,
NULL, NULL, 0);
这个 returns -12,映射到 ENOMEM
(内存不足)错误,但这对我来说没有意义,因为我有足够的内存。
作为参考,这是我在 运行 'vainfo':
之后的输出
libva info: VA-API version 1.7.0
libva info: Trying to open /usr/lib/x86_64-linux-gnu/dri/iHD_drv_video.so
libva info: Found init function __vaDriverInit_1_7
libva info: va_openDriver() returns 0
vainfo: VA-API version: 1.7 (libva 2.6.0)
vainfo: Driver version: Intel iHD driver for Intel(R) Gen Graphics - 20.1.1 ()
vainfo: Supported profile and entrypoints
VAProfileMPEG2Simple : VAEntrypointVLD
VAProfileMPEG2Main : VAEntrypointVLD
VAProfileH264Main : VAEntrypointVLD
VAProfileH264Main : VAEntrypointEncSliceLP
VAProfileH264High : VAEntrypointVLD
VAProfileH264High : VAEntrypointEncSliceLP
VAProfileJPEGBaseline : VAEntrypointVLD
VAProfileJPEGBaseline : VAEntrypointEncPicture
VAProfileH264ConstrainedBaseline: VAEntrypointVLD
VAProfileH264ConstrainedBaseline: VAEntrypointEncSliceLP
VAProfileVP8Version0_3 : VAEntrypointVLD
VAProfileHEVCMain : VAEntrypointVLD
VAProfileHEVCMain10 : VAEntrypointVLD
VAProfileVP9Profile0 : VAEntrypointVLD
VAProfileVP9Profile2 : VAEntrypointVLD
谢谢!
好的,所以我想出了问题所在。
即使我的系统上安装了正确的 FFmpeg 配置(带 --enable-hwaccel=h264_vaapi
的那个),问题是我 link 使用错误版本的 libav 来运行我的程序,一个包含在 libwebrtc 中,而不是我系统中的一个。
所以我不正确的 Makefile 是这样的:
LDLIBS += -lwebrtc -lpthread -lm -lavcodec -lavutil -lavformat -lavdevice
所以它 link 首先使用 libwebrtc,然后使用那里的 libav 东西。
在我将 -lwebrtc 移动到 -lavcodec -lavutil 之后的 link 之后,它开始工作了:
LDLIBS += -lpthread -lm -lavcodec -lavutil -lavformat -lavdevice -lwebrtc
此外,我确保 运行 使用 sudo 程序,否则它会给我其他错误。
我正在尝试使用 ffmpeg 的 vaapi 库在 GPU 上执行 h264 视频编码。
我一直在关注来自 ffmpeg Github 存储库的这个 example。
这里对我来说失败了:
AVBufferRef* vaapi_encoder;
int err = av_hwdevice_ctx_create(&vaapi_encoder, AV_HWDEVICE_TYPE_VAAPI,
NULL, NULL, 0);
这个 returns -12,映射到 ENOMEM
(内存不足)错误,但这对我来说没有意义,因为我有足够的内存。
作为参考,这是我在 运行 'vainfo':
之后的输出libva info: VA-API version 1.7.0
libva info: Trying to open /usr/lib/x86_64-linux-gnu/dri/iHD_drv_video.so
libva info: Found init function __vaDriverInit_1_7
libva info: va_openDriver() returns 0
vainfo: VA-API version: 1.7 (libva 2.6.0)
vainfo: Driver version: Intel iHD driver for Intel(R) Gen Graphics - 20.1.1 ()
vainfo: Supported profile and entrypoints
VAProfileMPEG2Simple : VAEntrypointVLD
VAProfileMPEG2Main : VAEntrypointVLD
VAProfileH264Main : VAEntrypointVLD
VAProfileH264Main : VAEntrypointEncSliceLP
VAProfileH264High : VAEntrypointVLD
VAProfileH264High : VAEntrypointEncSliceLP
VAProfileJPEGBaseline : VAEntrypointVLD
VAProfileJPEGBaseline : VAEntrypointEncPicture
VAProfileH264ConstrainedBaseline: VAEntrypointVLD
VAProfileH264ConstrainedBaseline: VAEntrypointEncSliceLP
VAProfileVP8Version0_3 : VAEntrypointVLD
VAProfileHEVCMain : VAEntrypointVLD
VAProfileHEVCMain10 : VAEntrypointVLD
VAProfileVP9Profile0 : VAEntrypointVLD
VAProfileVP9Profile2 : VAEntrypointVLD
谢谢!
好的,所以我想出了问题所在。
即使我的系统上安装了正确的 FFmpeg 配置(带 --enable-hwaccel=h264_vaapi
的那个),问题是我 link 使用错误版本的 libav 来运行我的程序,一个包含在 libwebrtc 中,而不是我系统中的一个。
所以我不正确的 Makefile 是这样的:
LDLIBS += -lwebrtc -lpthread -lm -lavcodec -lavutil -lavformat -lavdevice
所以它 link 首先使用 libwebrtc,然后使用那里的 libav 东西。
在我将 -lwebrtc 移动到 -lavcodec -lavutil 之后的 link 之后,它开始工作了:
LDLIBS += -lpthread -lm -lavcodec -lavutil -lavformat -lavdevice -lwebrtc
此外,我确保 运行 使用 sudo 程序,否则它会给我其他错误。