首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PyAv av.open()指定使用的编解码器

PyAv av.open()指定使用的编解码器
EN

Stack Overflow用户
提问于 2020-08-15 12:48:45
回答 1查看 689关注 0票数 1

当使用PyAv打开alsa音频设备时。我如何指定使用的编解码器,而不是ffmpeg默认编解码器,因为这是错误的。默认情况下,它将使用pcm_s16le,而我需要使用pcm_s32le。我可以使用下面的ffmpeg命令从我的设备进行录制:

代码语言:javascript
复制
ffmpeg -f alsa -acodec pcm_s32le -i dmic_sv alsaout.wav

但不是用

代码语言:javascript
复制
ffmpeg -f alsa -i dmic_sv alsaout.wav

这将给我以下错误:

代码语言:javascript
复制
[alsa @ 0x12061c0] cannot set sample format 0x10000 2 (Invalid argument)
dmic_sv: Input/output error

如何将工作命令传递给PyAv av.open()函数?虽然有stream_options,但它似乎不起作用。我试过了

代码语言:javascript
复制
stream_options = [{'-acodec': 'pcm_s32le'}]
av.open('dmic_sv', format='alsa', mode='r', stream_options=stream_options)

我得到的结果和上面的一样。

代码语言:javascript
复制
av.error.OSError: [Errno 5] Input/output error: 'dmic_sv'; last error log: [alsa] cannot set sample format 0x10000 2 (Invalid argument)

该怎么做呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-29 02:09:57

我会回答我自己的问题,因为我已经弄明白了。我读了ffmpeg的源代码,发现当使用alsa音频设备和未指定编解码器时,ffmpeg将默认使用带符号的16位pcm样本。代码here。通过进一步探索源代码,编解码值来自于AVFormatContext::audio_codec_id结构字段。

现在弄清楚PyAV使用Cython来使用FFmpeg,并且通过阅读Container类的PyAV源代码,我注意到它在它的self.ptr变量中包含了AVFormatContext。然后读取InputContainer源代码,特别是在调用avformat_open_input函数打开alsa设备之前。PyAV不支持指定使用的音频编解码器。

我对库进行了分支,并迅速结束了为我破解solution的工作。现在的问题是,是否有可能将此功能添加到PyAV中,以强制用于音频的编解码器?在这种情况下,当设备使用pcm采样并依赖ffmpeg使用时,选择默认的,它将始终使用16位采样,而在我的示例中,我需要使用32位采样。

希望这对某些人有帮助,并省去他们我经历的麻烦:)我也在PyAV issue here上发布了同样的答案。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63422670

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档