簡體   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