Android mtk單路錄音問題

在單路錄音中,有兩種情況導致底層錄音資源被佔用的問題:

1 開啓vmLog後,撥打一個電話,掛斷電話。如果掛斷電話後,沒有關閉vmlog進程,則會導致其它AP 無法得到底層的錄音資源,從而無法錄音。

2 打開第三方錄音軟件,第三方錄音軟件在後臺getinput,一直佔用底層資源,不釋放的情況話,則會導致其它AP 無法得到底層的錄音資源,從而無法錄音。

    當第三方錄音軟件退出後,由於後臺一直佔用底層資源,沒有釋放mic source,也會導致其它AP 無法得到底層的錄音資源,從而無法錄音。

    當第三方錄音軟件退出前,把它得到的getinput交給別的AP,沒有釋放mic source,也會導致其它AP 無法得到底層的錄音資源,即使重啓手機也無法錄音。

    當第三方錄音軟件退出後,重啓手機,第三方錄音軟件的後臺自動運行,然後會getinput source的動作,這樣後臺會一直佔用input source,也會導致其它AP 無法得到底層的錄音資源,即使重啓手機也無法錄音。

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

目前mtk的75,15,77,17平臺硬件上只支持單路錄音,不支持多路錄音,後續89平臺在這塊已經做了改進,多路錄音需要硬件支持,後續更高階的平臺是可以支持多路錄音的。
PDXXXX是mtk77平臺,硬件上只支持單路錄音,不支持多路錄音。
開發分析是因爲使用第三方微信的時候,一直佔用底層的錄音資源,沒有釋放資源造成的。(當問題出現後,把微信進程從後臺服務中殺掉或卸載掉後,重啓手機就會恢復)
建議第三方微信,在不用的時候及時釋放底層錄音資源,使其他AP及時獲得底層錄音資源,可以正常錄音。
第三方微信被佔用的mtklog如下所示:

第三方微信被佔用的mtklog:
11-29 09:10:52.891   116   346 D AudioRecord: getInput(): fail retry 0
11-29 09:10:52.891   116   346 D AudioYusuPolicyManager: getDeviceForInputSource()input source 1, device 00040000
11-29 09:10:52.891   116   346 D AudioYusuPolicyManager: getInput() inputSource 1, samplingRate 48000, format 1, channelMask c, acoustics 7
11-29 09:10:52.891   116   346 D AudioStreamHandler: +openInputStream devices = 40000 format = 1 channelCount = 12 samplerate = 48000
11-29 09:10:52.891   116   346 D AudioStreamHandler: openInputStream :: no free stream available
11-29 09:10:52.891   116   346 V AudioFlinger: openInput() openInputStream returned input 0x0, SamplingRate 48000, Format 1, Channels c, status 1098266528
11-29 09:10:52.891   116   346 D AudioYusuPolicyManager: getInput() failed opening input: samplingRate 48000, format 1, channelMask 12
11-29 09:10:52.896   116   346 D AudioRecord: getInput(): fail retry 1
11-29 09:10:52.896   116   346 D AudioYusuPolicyManager: getDeviceForInputSource()input source 1, device 00040000
11-29 09:10:52.896   116   346 D AudioYusuPolicyManager: getInput() inputSource 1, samplingRate 48000, format 1, channelMask c, acoustics 7
11-29 09:10:52.896   116   346 D AudioStreamHandler: +openInputStream devices = 40000 format = 1 channelCount = 12 samplerate = 48000
11-29 09:10:52.896   116   346 D AudioStreamHandler: openInputStream :: no free stream available
11-29 09:10:52.896   116   346 V AudioFlinger: openInput() openInputStream returned input 0x0, SamplingRate 48000, Format 1, Channels c, status 1098266528
11-29 09:10:52.896   116   346 D AudioYusuPolicyManager: getInput() failed opening input: samplingRate 48000, format 1, channelMask 12
11-29 09:10:52.901   116   346 D AudioRecord: getInput(): fail retry 2
11-29 09:10:52.901   116   346 D AudioYusuPolicyManager: getDeviceForInputSource()input source 1, device 00040000
11-29 09:10:52.901   116   346 D AudioYusuPolicyManager: getInput() inputSource 1, samplingRate 48000, format 1, channelMask c, acoustics 7
11-29 09:10:52.901   116   346 D AudioStreamHandler: +openInputStream devices = 40000 format = 1 channelCount = 12 samplerate = 48000
11-29 09:10:52.901   116   346 D AudioStreamHandler: openInputStream :: no free stream available
11-29 09:10:52.901   116   346 V AudioFlinger: openInput() openInputStream returned input 0x0, SamplingRate 48000, Format 1, Channels c, status 1098266528
11-29 09:10:52.901   116   346 D AudioYusuPolicyManager: getInput() failed opening input: samplingRate 48000, format 1, channelMask 12
11-29 09:10:52.901   116   346 E AudioRecord: Could not get audio input for record source 1
11-29 09:10:52.901   116   346 E StagefrightRecorder: audio source is not initialized
11-29 09:10:52.901   116   346 D StagefrightRecorder: start done status=-2147483648
11-29 09:10:52.901   612   612 E MediaRecorder: start failed: -2147483648
11-29 09:10:52.902   612   612 E MediaRecorderWrapper: MediaRecorder start errorjava.lang.RuntimeException: start failed.

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

目前,PDXXXX是Android4.0平臺,對於3gpp格式的錄音文件,其編碼方式是採用16K採樣率,處理數據的比特率128K,雙聲道。3gpp格式的錄音文件,在電腦上播放時,與該播放器的解碼器相關。如果此播放器的解碼器 支持16K採樣率,處理數據的比特率128K,雙聲道,將可以正常播放,如PotPlayer可以正常播放。用戶可以使用支持此編碼方式的播放器,像PotPlayer播放器進行播放.
而amr格式的錄音文件其編碼方式爲8K採樣率,處理數據的比特率12.2k,單聲道,而電腦上的播放器的解碼器都是支持此編碼方式,所以amr格式的錄音文件在電腦和手機上都是可以播放的。

改善方案及臨時措施:建議用戶使用支持3gpp格式的播放器,如PotPlayer進行播放。同時建議:建議將amr格式的錄音文件設置爲默認的錄音文件,他的編碼方式和解碼方式在手機和電腦上都是支持的,普遍性比較好。
長期改善措施:建議將amr格式的錄音文件設置爲默認的錄音文件,他的編碼方式和解碼方式在手機和電腦上都是支持的,普遍性比較好。對於3gpp格式的錄音文件,它是專用移動多媒體錄音文件,沒有amr格式的錄音文件通用性強。

目前mtk的75,15,77,17平臺硬件上只支持單路錄音,不支持多路錄音,後續89平臺在這塊已經做了改進,多路錄音需要硬件支持,後續MTK更高階的平臺是可以支持多路錄音的。
開啓語音喚醒後,它會一直佔用底層錄音資源(此情況已經和做語音喚醒的吳華琛覈實),不釋放的情況下,如果是單路錄音,則會導致其它AP無法得到底層的錄音資源,從而無法錄音。
PD1216B是6589平臺所以1216B無此現象,PD1224T是17平臺所以不可以。


發佈了82 篇原創文章 · 獲贊 5 · 訪問量 22萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章