繁体   English   中英

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

[英]PyAv av.open() specify used codec

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

ffmpeg -f alsa -acodec pcm_s32le -i dmic_sv alsaout.wav

但不与

ffmpeg -f alsa -i dmic_sv alsaout.wav

这会给我以下错误:

[alsa @ 0x12061c0] cannot set sample format 0x10000 2 (Invalid argument)
dmic_sv: Input/output error

如何将工作命令转移到 PyAv av.open() function? stream_options但它似乎不起作用。 我试过了

stream_options = [{'-acodec': 'pcm_s32le'}]
av.open('dmic_sv', format='alsa', mode='r', stream_options=stream_options)

我得到的和上面一样。

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

这个怎么做?

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

现在弄清楚 PyAV 使用 Cython 来使用 FFmpeg 并通过阅读容器class 的 PyAV 源代码,我注意到它在self.ptr变量中保存了AVFormatContext 然后阅读InputContainer源代码,尤其是在调用avformat_open_input function 打开 alsa 设备之前。 PyAV 不支持指定使用的音频编解码器。

我分叉了图书馆,并很快为我破解了解决方案 现在的问题是是否可以将此功能添加到 PyAV 以强制用于音频的编解码器? 在这种情况下,当设备使用 pcm 样本并依赖 ffmpeg 使用选择默认值时,它将始终使用 16 位样本,而在我的情况下,我需要使用 32 位样本。

希望这可以帮助某人并为他们省去我遇到的麻烦:) 我也在这里发布了针对 PyAV 问题的相同答案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM