【ffplay】音频无法正常播放:XAudio2Create() failed at open

经过上一步的项目配置,视频正常播放,但是音频播放出现问题,下文给出作者修改的过程

错误1

根据No more combinations to try, audio open failed错误,定位到ffplay.c如下函数

cpp 复制代码
while (!(audio_dev = SDL_OpenAudioDevice(NULL, 0, &wanted_spec, &spec, SDL_AUDIO_ALLOW_FREQUENCY_CHANGE | SDL_AUDIO_ALLOW_CHANNELS_CHANGE))) {
    av_log(NULL, AV_LOG_WARNING, "SDL_OpenAudio (%d channels, %d Hz): %s\n",
           wanted_spec.channels, wanted_spec.freq, SDL_GetError());
    wanted_spec.channels = next_nb_channels[FFMIN(7, wanted_spec.channels)];
    if (!wanted_spec.channels) {
        wanted_spec.freq = next_sample_rates[next_sample_rate_idx--];
        wanted_spec.channels = wanted_nb_channels;
        if (!wanted_spec.freq) {
            av_log(NULL, AV_LOG_ERROR,
                   "No more combinations to try, audio open failed\n");
            return -1;
        }
    }
    wanted_channel_layout = av_get_default_channel_layout(wanted_spec.channels);
}
  1. 本函数作用是打开音频设备播放音频数据,经过调试得到!wanted_spec.freq)值为0,因此报错:No more combinations to try, audio open failed\n

  2. 向上找:wanted_spec.freq = next_sample_rates[next_sample_rate_idx--];,判断是next_sample_rate_idx值出现问题

  3. 再次定位如下代码:

    cpp 复制代码
    while (next_sample_rate_idx && next_sample_rates[next_sample_rate_idx] >= wanted_spec.freq)
          next_sample_rate_idx--;

    这个函数作用是从采样率数组中找到第一个不大于传入参数wanted_sample_rate的值

    此时,wanted_spec.freq=44100next_sample_rate_idx = 4,next_sample_rates = {0, 44100, 48000, 96000, 192000}

    函数返回时,next_sample_rate_idx = 0,从而导致wanted_spec.freq = 0,最终报错

    修改:大于等于号变为大于号

    arduino 复制代码
     while (next_sample_rate_idx && next_sample_rates[next_sample_rate_idx] > wanted_spec.freq)

    此时,next_sample_rate_idx = 1wanted_spec.freq = 44100

错误2

这条错误消息表明当你尝试使用 SDL 打开音频设备时,发生了一个错误,特别是在使用 XAudio2 API 时。

XAudio2 是 Microsoft DirectX SDK 中的一部分,它是用于在 Windows 平台上进行高性能音频处理和音频渲染的音频库。

经过chatgpt和查阅资料,解决方案是:添加CoInitialize(NULL) 在 Windows 环境中初始化 COM 。

步骤:

1 在read_phtread()函数内添加代码

scss 复制代码
 CoInitialize(NULL);

2 ffplay.c包含头文件

arduino 复制代码
 #include <objbase.h>

3 .pro文件中添加lib库

shell 复制代码
 $$PWD/Ole32.Lib
  • 使用everything查找Ole32.Lib
  • 项目是32下,因此选取的是x86的lib文件
  • 将lib放入项目目录下(不是运行目录,运行目录下存放的是dll动态库)

修改完以上两个错误,声音正常播放!

相关推荐
Tiny_React1 天前
使用 Claude Code Skills 模拟的视频生成流程
人工智能·音视频开发·vibecoding
hk112410 天前
【音视频/边缘计算】2025年度H.265/HEVC高并发解码与画质修复(Super-Resolution)基准测试报告(含沙丘/失控玩家核心样本)
ffmpeg·边缘计算·音视频开发·h.265·测试数据集
李小轰_Rex20 天前
把手机变成听诊器!摄像头 30 秒隔空测心率 - 开箱即用
android·音视频开发
李小轰_Rex21 天前
纯算法AEC:播录并行场景的回声消除实战笔记
android·音视频开发
否子戈22 天前
WebCut前端视频编辑UI框架一周开源进度
前端·音视频开发·ui kit
SHERlocked9325 天前
摄像头 RTSP 流视频多路实时监控解决方案实践
c++·后端·音视频开发
mortimer1 个月前
Python + FFmpeg 视频自动化处理指南:从硬件加速到精确剪辑
python·ffmpeg·音视频开发
否子戈1 个月前
做中国人自己的视频编辑UI框架,WebCut正式开源
前端框架·音视频开发·视频编码
音视频牛哥1 个月前
从低延迟到高可用:RTMP与 HTTP/HTTPS-FLV在App播放体系中的角色重构
人工智能·音视频·音视频开发·http-flv播放器·https-flv播放器·ws-flv播放器·wss-flv播放器
音视频牛哥2 个月前
轻量级RTSP服务的工程化设计与应用:从移动端到边缘设备的实时媒体架构
人工智能·计算机视觉·音视频·音视频开发·rtsp播放器·安卓rtsp服务器·安卓实现ipc功能