ffplay中只能看图像不能听声音的解决方法

本文记录了作者在使用ffplay播放器时遇到的声音缺失问题及其解决方案。通过对XAudio2初始化失败错误的深入分析,最终在read_thread中加入CoInitialize(NULL)解决了问题。

最近想弄一个简单的播放器,所以下载了ffmpeg2.0.1的代码和库,下载SDL 1.3.0, 开发环境是VS2010。

编译ffplay的过程挺烦的,改了不少配置和代码,网上很多说明,搜一下就知道,这里就不赘述。

好不容易编译通过,试运行ffplay,呵呵,图像出来了,心里暗喜,但是过了一会儿,发现没有声音。

看输出信息,发现有以下错误:

SDL_OpenAudio (2 channels): XAudio2: XAudio2Create() failed .
SDL_OpenAudio (1 channels): XAudio2: XAudio2Create() failed .
No more channel combinations to try, audio open failed

跟踪SDL代码,发现XAudio2Create()返回的HRESULT是1,这个错误是什么意思?没查到。

后来根据以前COM开发的经验,依稀记得应该是初始化有问题。

查ffplay.c的代码,发现SDL_Init()是在主线程中执行的,而SDL_OpenAudio ()是在read_thread中执行的。

于是就试着在read_thread进入的地方加上CoInitialize(NULL)。

编译,运行,成功了。


### 使用 ffplay 播放示单通道图像文件 `ffplay` 是 FFmpeg 提供的一个简单媒体播放工具,支持多种音视频格式以及图像序列的播放。对于单通道图像(如灰度图),可以通过指定输入参数来实现正常显示。 以下是具体方法: #### 方法一:直接播放单张图像 如果目标是播放一张静态的单通道图像文件,则可以直接通过 `ffplay` 执行如下命令: ```bash ffplay -loop 0 single_channel_image.png ``` 上述命令中的 `-loop 0` 参数表示无限循环播放该图像[^1]。如果没有设置此选项,默认情况下会快速加载并退出。 #### 方法二:构建伪视频流以连续展示多帧单通道图像 当需要按顺序播放一系列单通道图像时,可以利用 FFmpeg 的功能先将其转换成临时视频流再传递给 `ffplay` 进行回放。例如: ```bash ffmpeg -framerate 1 -pattern_type glob -i 'single_channel_*.pgm' -c:v rawvideo pipe:1 | ffplay - ``` 在此例子中: - `-framerate 1` 定义每秒切换一次新画面; - `'single_channel_*.pgm'` 表示匹配当前目录下的所有符合命名模式的 PGM 格式的单通道图像文件; - 输出管道 (`pipe:1`) 将生成的数据流转交给后续程序处理;最后由 `ffplay -` 接收标准输入作为源素材完成实际渲染工作[^2]。 注意:确保所使用的图像格式被 FFmpeg 支持解析,并且像素编码适合屏幕呈现需求。 ### 示例代码片段 下面给出一段 Python 脚本用于自动化创建测试用的单通道 BMP 图像集合及其对应的播放指令调用过程演示。 ```python import os from PIL import Image, ImageDraw def generate_single_channel_images(count=5): """Generate a set of single-channel (grayscale) images.""" size = (640, 480) for i in range(1, count + 1): img = Image.new('L', size) # Create new grayscale image. draw = ImageDraw.Draw(img) text = f"Frame {i}" draw.text((10, 10), text, fill="white") # Add some visible content. filename = f"frame_{i}.bmp" img.save(filename) if __name__ == "__main__": num_frames = 3 generate_single_channel_images(num_frames) print("\nGenerated frames can now be played using the following command:") cmd_example = ( "ffmpeg -framerate 1 " "-pattern_type glob -i 'frame_*.bmp' " "-vf format=gray -f rawvideo pipe:1 | ffplay -autoexit -f rawvideo -pixel_format gray -video_size 640x480 -" ) print(cmd_example) ``` 运行以上脚本后将会生产若干 BMP 文件代表不同编号的画面内容,接着按照打印出来的提示执行关联 Shell 命令即可看到预期效果。 ---
评论 9
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值