mciSendString()无法播放带封面音频文件的技术求助
解决方案:mciSendString() 播放带封面音频文件的轨道选择问题
核心问题定位
你的推测完全正确——部分带封面的音频文件会将封面嵌入为独立的"轨道"(通常是图片流),而mciSendString()默认会选择文件的第一个轨道播放,导致误播放封面而非音频轨道。
具体解决步骤
1. 直接指定音频轨道播放
在mciSendString()的打开命令中,明确指定要播放的音频轨道,替代默认选择逻辑。示例代码调整如下:
原打开命令(可能存在的写法):
mciSendString("open \"test.mp3\" type mpegvideo alias mp3player", NULL, 0, NULL);
修改为指定轨道(音频轨道通常为第1或第2,可根据实际文件调整):
// 明确指定播放第1个音频轨道 mciSendString("open \"test.mp3\" type mpegvideo alias mp3player audio track 1", NULL, 0, NULL);
2. 动态检测并切换到音频轨道
如果无法提前确定轨道编号,可以先查询文件的所有轨道信息,再筛选出音频轨道切换过去:
char buffer[256]; // 查询文件总轨道数 mciSendString("status mp3player number of tracks", buffer, sizeof(buffer), NULL); int trackCount = atoi(buffer); // 遍历所有轨道,识别音频轨道 for (int i = 1; i <= trackCount; i++) { char trackType[32]; sprintf(buffer, "status mp3player track %d type", i); mciSendString(buffer, trackType, sizeof(trackType), NULL); // 判断是否为音频类型(兼容不同格式的标识) if (strstr(trackType, "Audio") != NULL) { // 切换到该音频轨道 sprintf(buffer, "set mp3player audio track %d", i); mciSendString(buffer, NULL, 0, NULL); break; } }
3. 兼容多格式轨道标识
不同音频格式的轨道类型标识可能有差异:MP3的音频轨道可能显示为MPEG Audio,FLAC可能显示为PCM Audio,所以判断时只要包含"Audio"关键词即可,无需严格匹配完整字符串。
验证参考
结合你提供的FFmpeg分析结果,比如输出显示:
Stream #0:0: Video: mjpeg (Baseline), yuvj420p(pc, bt470bg/unknown/unknown), 600x600 [SAR 1:1 DAR 1:1], 90k tbr, 90k tbn, 90k tbc (attached pic)
Stream #0:1: Audio: mp3, 44100 Hz, stereo, fltp, 192 kb/s
这里音频轨道是第2个(轨道编号从1开始计数),打开时指定audio track 2即可正常播放。
内容的提问来源于stack exchange,提问作者EnigmaCoder
相关产品推荐
相关产品推荐

