c++ - 如何在 C++ 中使用 ffmpeg 从 .webm 视频读取 Alpha channel

标签 c++ video ffmpeg alpha webm

背景

我有一个从 .mov 视频文件转换而来的 .webm 文件 (pix_fmt: yuva420p),以减少文件大小,我想使用读取视频数据c++,所以我接着使用这个 repo作为引用。

这在 .mov 视频上完美运行。

问题

但是,通过使用相同的存储库,.webm 视频没有 Alpha channel 数据(该 channel 上的纯零),但我可以从 .mov 视频获取 Alpha 数据。

显然很多people已经注意到,在视频转换后,ffmpeg 以某种方式将视频检测为 yuv420p + alpha_mode : 1,因此不使用 alpha channel ,但没有人讨论此问题的解决方法。

我尝试在这部分期间强制像素格式使用yuva420p,但这只是破坏了整个程序。

  // Set up sws scaler
    if (!sws_scaler_ctx) {
        auto source_pix_fmt = correct_for_deprecated_pixel_format(av_codec_ctx->pix_fmt);
        sws_scaler_ctx = sws_getContext(width, height, source_pix_fmt,
                                        width, height, AV_PIX_FMT_RGB0,
                                        SWS_BILINEAR, NULL, NULL, NULL);
    }

我还使用其他 source 验证了我的视频,它包含 Alpha channel 所以我确信我的 webm 视频中有 Alpha channel ,但我无法使用 ffmpeg 获取数据。

有没有办法获取 alpha 数据?其他视频格式或使用其他库也可以工作,只要它确实有一些文件压缩,但我需要在 C++ 中访问数据。

注意:这是我用于将视频转换为 webm

的代码
ffmpeg -i input.mov -c:v libvpx-vp9 -pix_fmt yuva420p output.webm

最佳答案

您必须强制解码器。

avformat_open_input()之前设置以下内容

AVCodec *vcodec;
vcodec = avcodec_find_decoder_by_name("libvpx-vp9");
av_fmt_ctx->video_codec = vcodec;
av_fmt_ctx->video_codec_id = vcodec->id;

您不需要设置像素格式或任何缩放器参数。

这假设您的 libavcodec 与 libvpx 链接。

关于c++ - 如何在 C++ 中使用 ffmpeg 从 .webm 视频读取 Alpha channel ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74217172/

相关文章:

c# - C# 中的静态全局变量具有文件作用域?

video - 有关DirectShow.NET,DirectShow和Windows Media格式的一般问题

linux - 通过 GStreamer 分割视频

c - 尝试使用 ffmpeg 解码音频时如何摆脱 Unresolved external 错误

streaming - “Hook” libMMS 到 FFmpeg 用于 iPhone 流媒体

c++ - 未解析的外部符号 __imp__Inf 和 __imp__Nan

c++ - 使用 gnu g++ 解决 Windows 中堆栈限制的解决方法

android - WebView 确实需要一些帮助

ffmpeg - ffmpeg 是否违反 SAT>IP 规范(DESCRIBE 语法)?

c++ - 确定用于在 *ix 操作系统上构建共享对象的编译器和版本