基于FFmpeg (WebAssembly)的音视频容器解复用问题求助
核心原因
你遇到的问题本质是当前使用的FFmpeg-WASM构建版本缺少H264编解码器的解析器(parser)和必要组件支持。
警告里的parser not found for codec h264是关键信号——这说明FFmpeg在编译时没有包含H264解析器,导致无法正确解析H264视频流的参数,进而引发后续av_read_frame报错。你尝试添加的-enable-parser=h264是CLI参数,但WASM版本的FFmpeg功能支持是在编译阶段决定的,运行时添加参数无效。
另外,示例项目的构建脚本大概率只默认包含了音频相关的编解码器/解析器(比如AAC、MP3等),没有包含H264视频相关组件,所以纯音频文件能正常处理,带视频的文件就会失败。
解决步骤:扩展示例的FFmpeg-WASM构建流程
你需要修改Emscripten构建脚本,显式添加H264及MP4容器相关的编译选项,重新构建FFmpeg-WASM:
修改构建配置
在FFmpeg的configure命令中添加以下关键选项:./configure \ --target-os=none \ --arch=emscripten \ --enable-cross-compile \ --disable-programs \ --disable-doc \ --disable-static \ --enable-shared \ # 启用H264相关组件 --enable-parser=h264 \ --enable-decoder=h264 \ --enable-demuxer=mov \ # MP4属于mov容器格式,确保启用 --enable-protocol=file \ # 保留原有音频支持 --enable-parser=aac \ --enable-decoder=aac \ # 其他原有配置...验证构建结果
构建完成后,在代码中调用avcodec_configuration()函数,打印FFmpeg的编译配置信息,确认输出中包含--enable-parser=h264和--enable-decoder=h264,以此验证H264组件已被正确编译进去。
补充优化:调整流探测参数
虽然不是根本问题,但警告中提到的analyzeduration和probesize参数可以优化FFmpeg对视频流的探测能力,避免因探测不充分导致的参数获取失败。在调用avformat_open_input()前添加以下代码:
AVDictionary *options = NULL; // 设置更长的分析时长和探测大小,帮助FFmpeg完整读取流参数 av_dict_set(&options, "analyzeduration", "20000000", 0); // 20秒 av_dict_set(&options, "probesize", "10000000", 0); // 10MB // 打开文件时传入options int ret = avformat_open_input(&fmt_ctx, filename, NULL, &options); av_dict_free(&options);
内容的提问来源于stack exchange,提问作者KWeb

