我們在做Android平臺RTMP推送和GB28181設(shè)備對接的時候,遇到這樣的問題,有的設(shè)備,麥克風(fēng)采集出來的audio,音量過高或過低,特別是有些設(shè)備,采集到的麥克風(fēng)聲音過低,導(dǎo)致播放端聽不清前端采集的audio,這時候,就需要針對采集到的audio,做音量放大處理。
先說如何采集,android平臺通用的做法是采集audiorecord,設(shè)置audio的采樣率和channels,為了便于數(shù)據(jù)進(jìn)行二次處理,或者同時投遞給多個實例,我們的做法,是把采集到的audio,回調(diào)上來,然后再設(shè)置到j(luò)ni層:
void CheckInitAudioRecorder() {
if (audioRecord_ == null) {
audioRecord_ = new NTAudioRecordV2(this);
}
if (audioRecord_ != null) {
Log.i(TAG, "CheckInitAudioRecorder call audioRecord_.start()+++...");
audioRecordCallback_ = new NTAudioRecordV2CallbackImpl();
audioRecord_.AddCallback(audioRecordCallback_);
audioRecord_.Start(16000, 1);
Log.i(TAG, "CheckInitAudioRecorder call audioRecord_.start()---...");
}
}
audio回調(diào)處理:
class NTAudioRecordV2CallbackImpl implements NTAudioRecordV2Callback {
@Override
public void onNTAudioRecordV2Frame(ByteBuffer data, int size, int sampleRate, int channel, int per_channel_sample_number) {
if ((isPushingRtmp || isRTSPPublisherRunning) && publisherHandle != 0) {
libPublisher.SmartPublisherOnPCMData(publisherHandle, data, size, sampleRate, channel, per_channel_sample_number);
}
}
}
如何實現(xiàn)audio音量放大?
輸入音量的調(diào)節(jié),需要注意的是,處理音頻音量時要盡可能線性,以防止溢出。我們針對jni層的設(shè)計如下:
/**
* 設(shè)置輸入音量, 這個接口一般不建議調(diào)用, 在一些特殊情況下可能會用, 一般不建議放大音量
*
* @param index: 一般是0和1, 如果沒有混音的只用0, 有混音的話, 0,1分別設(shè)置音量
*
* @param volume: 音量,默認(rèn)是1.0,范圍是[0.0, 5.0], 設(shè)置成0靜音, 1音量不變
*
* @return {0} if successful
*/
public native int SmartPublisherSetInputAudioVolume(long handle, int index, float volume);
調(diào)用邏輯如下:
in_audio_volume_selector_ = (Spinner) findViewById(R.id.in_audio_volume_selector);
final String[] in_audio_volume_sel = new String[]{"0", "0.2", "0.5", "0.8", "1", "1.5", "2", "2.5", "3", "3.5", "4", "4.5", "5"};
ArrayAdapter<String> adapter_in_audio_volume = new ArrayAdapter<String>(this,
android.R.layout.simple_spinner_item, in_audio_volume_sel);
adapter_in_audio_volume.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
in_audio_volume_selector_.setAdapter(adapter_in_audio_volume);
in_audio_volume_selector_.setSelection(4, true);
in_audio_volume_selector_.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view,
int position, long id) {
Log.i(TAG, "Currently audio volume choosing: " + in_audio_volume_sel[position]);
in_audio_volume_ = Float.parseFloat(in_audio_volume_sel[position]);
Log.i(TAG, "Choose audio volume=" + in_audio_volume_);
if (isPushingRtmp || isRTSPPublisherRunning) {
if (libPublisher != null && publisherHandle != 0) {
libPublisher.SmartPublisherSetInputAudioVolume(publisherHandle, 0, in_audio_volume_);
}
}
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
感興趣的開發(fā)者,可以參考實現(xiàn),需要注意的是,audio采集可能不限于麥克風(fēng),也可能是第三方數(shù)據(jù)采集源,所以接口設(shè)計的時候,盡量考慮在jni層針對數(shù)據(jù)源做處理,此外,除了音量放大外,還可以做音量縮小,或者實時靜音。文章來源:http://www.zghlxwxcb.cn/news/detail-645038.html
?文章來源地址http://www.zghlxwxcb.cn/news/detail-645038.html
到了這里,關(guān)于Android平臺RTMP推送或GB28181設(shè)備接入端如何實現(xiàn)采集audio音量放大?的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!