Android平台RTSP轻量级服务|RTMP推送摄像头或屏幕之音频接口设计
好多開發(fā)者在做Android平臺(tái)錄像或者RTSP輕量級(jí)服務(wù)、RTMP推送相關(guān)模塊時(shí),對(duì)需要設(shè)計(jì)哪些常用接口會(huì)心存疑惑,本文主要以大牛直播SDK(官方)為例,簡單介紹下Android平臺(tái)直播推送SDK所有音頻相關(guān)的接口,感興趣的開發(fā)者可以看看。
1. 設(shè)置audio編碼類型,默認(rèn)AAC,如需更低的碼率,可設(shè)置SPEEX編碼,一把考慮到錄像等操作的通用性,建議選擇AAC編碼。
/*** Set audio encoder type(設(shè)置音頻編碼類型)* * @param type: if with 1:AAC, if with 2: SPEEX* * @return {0} if successful*/public native int SmartPublisherSetAudioCodecType(long handle, int type);2. 設(shè)置AAC音頻編碼碼率,不再贅述。
/*** Set audio encoder bit-rate(設(shè)置音頻編碼碼率), 當(dāng)前只對(duì)AAC編碼有效** @param kbit_rate: 碼率(單位是kbps), 如果是0的話將使用默認(rèn)碼率, 必須大于等于0** @return {0} if successful*/public native int SmartPublisherSetAudioBitRate(long handle, int kbit_rate);3. 設(shè)置SPEEX音頻編碼質(zhì)量,一般設(shè)置到8即可。
/*** Set speex encoder quality(設(shè)置speex編碼質(zhì)量)* * @param quality: range with (0, 10), default value is 8* * @return {0} if successful*/public native int SmartPublisherSetSpeexEncoderQuality(long handle, int quality);4. 設(shè)置噪音抑制,噪音抑制可用于對(duì)采集到的audio數(shù)據(jù)如雜音背景音的消除
/*** Set Audio Noise Suppression(設(shè)置音頻噪音抑制)* * @param isNS: if with 1:suppress, if with 0: does not suppress* * @return {0} if successful*/public native int SmartPublisherSetNoiseSuppression(long handle, int isNS);5. 設(shè)置音頻自動(dòng)增益控制,AGC的目的是,系統(tǒng)可根據(jù)聲音大小自動(dòng)適當(dāng)調(diào)整音量,使聲音大小盡量保持一致
/*** Set Audio AGC(設(shè)置音頻自動(dòng)增益控制)* * @param isAGC: if with 1:AGC, if with 0: does not AGC* * @return {0} if successful*/public native int SmartPublisherSetAGC(long handle, int isAGC);6. 設(shè)置回音消除,用于一對(duì)一互動(dòng)場(chǎng)景下,消除音頻回音
/*** Set Audio Echo Cancellation(設(shè)置音頻回音消除)** @param isCancel: if with 1:Echo Cancellation, if with 0: does not cancel** @param delay: echo delay(ms), if with 0, SDK will automatically estimate the delay.** @return {0} if successful*/public native int SmartPublisherSetEchoCancellation(long handle, int isCancel, int delay);7. 設(shè)置混音,可用于比如兩路音頻混音場(chǎng)景,具體可參考一對(duì)一互動(dòng)的demo
/*** 設(shè)置混音,目前支持兩路音頻混音** @param is_mix: 1混音, 0不混音, 默認(rèn)不混音** @return {0} if successful*/public native int SmartPublisherSetAudioMix(long handle, int is_mix);8. 實(shí)時(shí)靜音,實(shí)時(shí)靜音顧名思義,推送過程中,暫停音頻推送
/*** Set mute or not during publish stream(設(shè)置實(shí)時(shí)靜音)* * @param isMute: if with 1:mute, if with 0: does not mute* * @return {0} if successful*/public native int SmartPublisherSetMute(long handle, int isMute);9. 用于設(shè)置輸入音量,范圍是[0.0, 5.0],除非麥克風(fēng)采集到的audio過小,一般不建議放大,放大的話,會(huì)引入噪音等
/*** 設(shè)置輸入音量, 這個(gè)接口一般不建議調(diào)用, 在一些特殊情況下可能會(huì)用, 一般不建議放大音量** @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);10. 對(duì)接外部實(shí)時(shí)采集的PCM數(shù)據(jù),考慮到集成方便,我們提供了以下三個(gè)接口,注意PCM音頻數(shù)據(jù)接口每10ms傳第一次audio數(shù)據(jù)
/*** 傳遞PCM音頻數(shù)據(jù)給SDK, 每10ms音頻數(shù)據(jù)傳入一次* * @param pcmdata: pcm數(shù)據(jù), 需要使用ByteBuffer.allocateDirect分配, ByteBuffer.isDirect()是true的才行.* @param size: pcm數(shù)據(jù)大小* @param sample_rate: 采樣率,當(dāng)前只支持{44100, 8000, 16000, 24000, 32000, 48000}, 推薦44100* @param channel: 通道, 當(dāng)前通道支持單通道(1)和雙通道(2),推薦單通道(1)* @param per_channel_sample_number: 這個(gè)請(qǐng)傳入的是 sample_rate/100*/public native int SmartPublisherOnPCMData(long handle, ByteBuffer pcmdata, int size, int sample_rate, int channel, int per_channel_sample_number);/*** 傳遞PCM音頻數(shù)據(jù)給SDK, 每10ms音頻數(shù)據(jù)傳入一次** @param pcmdata: pcm數(shù)據(jù), 需要使用ByteBuffer.allocateDirect分配, ByteBuffer.isDirect()是true的才行.* @param offset: pcmdata的偏移* @param size: pcm數(shù)據(jù)大小* @param sample_rate: 采樣率,當(dāng)前只支持{44100, 8000, 16000, 24000, 32000, 48000}, 推薦44100* @param channel: 通道, 當(dāng)前通道支持單通道(1)和雙通道(2),推薦單通道(1)* @param per_channel_sample_number: 這個(gè)請(qǐng)傳入的是 sample_rate/100*/public native int SmartPublisherOnPCMDataV2(long handle, ByteBuffer pcmdata, int offset, int size, int sample_rate, int channel, int per_channel_sample_number);/*** 傳遞PCM音頻數(shù)據(jù)給SDK, 每10ms音頻數(shù)據(jù)傳入一次** @param pcm_short_array: pcm數(shù)據(jù), short是native endian order* @param offset: 數(shù)組偏移* @param len: 數(shù)組項(xiàng)數(shù)* @param sample_rate: 采樣率,當(dāng)前只支持{44100, 8000, 16000, 24000, 32000, 48000}, 推薦44100* @param channel: 通道, 當(dāng)前通道支持單通道(1)和雙通道(2),推薦單通道(1)* @param per_channel_sample_number: 這個(gè)請(qǐng)傳入的是 sample_rate/100*/public native int SmartPublisherOnPCMShortArray(long handle, short[] pcm_short_array, int offset, int len, int sample_rate, int channel, int per_channel_sample_number);11. 設(shè)置傳遠(yuǎn)端數(shù)據(jù),主要用于一對(duì)一環(huán)境下,拉流端拉到的audio,回調(diào)上來,通過推送端這個(gè)接口設(shè)置下去,完成整體的回音消除
/*** Set far end pcm data* * @param pcmdata : 16bit pcm data* @param sampleRate: audio sample rate* @param channel: auido channel* @param per_channel_sample_number: per channel sample numbers* @param is_low_latency: if with 0, it is not low_latency, if with 1, it is low_latency* @return {0} if successful*/public native int SmartPublisherOnFarEndPCMData(long handle, ByteBuffer pcmdata, int sampleRate, int channel, int per_channel_sample_number, int is_low_latency);12. PCM混音音頻數(shù)據(jù)接口,注意,每10ms音頻數(shù)據(jù)傳入一次
/*** 傳遞PCM混音音頻數(shù)據(jù)給SDK, 每10ms音頻數(shù)據(jù)傳入一次** @param stream_index: 當(dāng)前只能傳1, 傳其他返回錯(cuò)誤* @param pcm_data: pcm數(shù)據(jù), 需要使用ByteBuffer.allocateDirect分配, ByteBuffer.isDirect()是true的才行.* @param offset: pcmdata的偏移* @param size: pcm數(shù)據(jù)大小* @param sample_rate: 采樣率,當(dāng)前只支持{44100, 8000, 16000, 24000, 32000, 48000}* @param channels: 通道, 當(dāng)前通道支持單通道(1)和雙通道(2)* @param per_channel_sample_number: 這個(gè)請(qǐng)傳入的是 sample_rate/100*/public native int SmartPublisherOnMixPCMData(long handle, int stream_index, ByteBuffer pcm_data, int offset, int size, int sample_rate, int channels, int per_channel_sample_number);/*** 傳遞PCM混音音頻數(shù)據(jù)給SDK, 每10ms音頻數(shù)據(jù)傳入一次** @param stream_index: 當(dāng)前只能傳1, 傳其他返回錯(cuò)誤* @param pcm_short_array: pcm數(shù)據(jù), short是native endian order* @param offset: 數(shù)組偏移* @param len: 數(shù)組項(xiàng)數(shù)* @param sample_rate: 采樣率,當(dāng)前只支持{44100, 8000, 16000, 24000, 32000, 48000}* @param channels: 通道, 當(dāng)前通道支持單通道(1)和雙通道(2)* @param per_channel_sample_number: 這個(gè)請(qǐng)傳入的是 sample_rate/100*/public native int SmartPublisherOnMixPCMShortArray(long handle, int stream_index, short[] pcm_short_array, int offset, int len, int sample_rate, int channels, int per_channel_sample_number);13. 用于編碼后audio數(shù)據(jù)對(duì)接,主要是轉(zhuǎn)發(fā)模塊使用
/*** 設(shè)置音頻數(shù)據(jù)(AAC/PCMA/PCMU/SPEEX)** @param codec_id:** NT_MEDIA_CODEC_ID_AUDIO_BASE = 0x10000,* NT_MEDIA_CODEC_ID_PCMA = NT_MEDIA_CODEC_ID_AUDIO_BASE,* NT_MEDIA_CODEC_ID_PCMU,* NT_MEDIA_CODEC_ID_AAC,* NT_MEDIA_CODEC_ID_SPEEX,* NT_MEDIA_CODEC_ID_SPEEX_NB,* NT_MEDIA_CODEC_ID_SPEEX_WB,* NT_MEDIA_CODEC_ID_SPEEX_UWB,** @param data audio數(shù)據(jù)** @param size data length** @param is_key_frame 是否I幀, if with key frame, please set 1, otherwise, set 0, audio忽略** @param timestamp video timestamp** @param parameter_info 用于AAC special config信息填充** @param parameter_info_size parameter info size** @return {0} if successful*/public native int SmartPublisherPostAudioEncodedData(long handle, int codec_id, ByteBuffer data, int size, int is_key_frame, long timestamp,ByteBuffer parameter_info, int parameter_info_size);/*** 設(shè)置音頻數(shù)據(jù)(AAC/PCMA/PCMU/SPEEX)** @param codec_id:** NT_MEDIA_CODEC_ID_AUDIO_BASE = 0x10000,* NT_MEDIA_CODEC_ID_PCMA = NT_MEDIA_CODEC_ID_AUDIO_BASE,* NT_MEDIA_CODEC_ID_PCMU,* NT_MEDIA_CODEC_ID_AAC,* NT_MEDIA_CODEC_ID_SPEEX,* NT_MEDIA_CODEC_ID_SPEEX_NB,* NT_MEDIA_CODEC_ID_SPEEX_WB,* NT_MEDIA_CODEC_ID_SPEEX_UWB,** @param data audio數(shù)據(jù)** @param offset data的偏移** @param size data length** @param is_key_frame 是否I幀, if with key frame, please set 1, otherwise, set 0, audio忽略** @param timestamp video timestamp** @param parameter_info 用于AAC special config信息填充** @param parameter_info_size parameter info size** @return {0} if successful*/public native int SmartPublisherPostAudioEncodedDataV2(long handle, int codec_id,ByteBuffer data, int offset, int size,int is_key_frame, long timestamp,byte[] parameter_info, int parameter_info_size);/*** 設(shè)置音頻數(shù)據(jù)(AAC/PCMA/PCMU/SPEEX)** @param codec_id:** NT_MEDIA_CODEC_ID_AUDIO_BASE = 0x10000,* NT_MEDIA_CODEC_ID_PCMA = NT_MEDIA_CODEC_ID_AUDIO_BASE,* NT_MEDIA_CODEC_ID_PCMU,* NT_MEDIA_CODEC_ID_AAC,* NT_MEDIA_CODEC_ID_SPEEX,* NT_MEDIA_CODEC_ID_SPEEX_NB,* NT_MEDIA_CODEC_ID_SPEEX_WB,* NT_MEDIA_CODEC_ID_SPEEX_UWB,** @param data audio數(shù)據(jù)** @param offset data的偏移** @param size data length** @param is_key_frame 是否I幀, if with key frame, please set 1, otherwise, set 0, audio忽略** @param timestamp video timestamp** @param parameter_info 用于AAC special config信息填充** @param parameter_info_size parameter info size** @param sample_rate 采樣率,如果需要錄像的話必須傳正確的值**@param channels 通道數(shù), 如果需要錄像的話必須傳正確的值, 一般是1或者2** @return {0} if successful*/public native int SmartPublisherPostAudioEncodedDataV3(long handle, int codec_id,ByteBuffer data, int offset, int size,int is_key_frame, long timestamp,byte[] parameter_info, int parameter_info_size,int sample_rate, int channels);14. 用于編碼后的音頻數(shù)據(jù)回調(diào),方便對(duì)接第三方系統(tǒng)
/*** Start output Encoded Data(用于編碼后的音視頻數(shù)據(jù)回調(diào))** @return {0} if successful*/public native int SmartPublisherStartOutputEncodedData(long handle);/*** Stop output Encoded Data** @return {0} if successful*/public native int SmartPublisherStopOutputEncodedData(long handle);總結(jié)
細(xì)數(shù)下來,光audio相關(guān)的接口也有20個(gè),可見開發(fā)個(gè)Android平臺(tái)RTMP直播推送模塊多么麻煩,當(dāng)然因?yàn)楸疚奶岬降腞TMP推送,實(shí)際使用的公司或開發(fā)者群體比較大,如果只是項(xiàng)目需求,好多是用不到的,可以適當(dāng)精簡,做個(gè)小而美的模塊,不失是個(gè)很好的選擇。
總結(jié)
以上是生活随笔為你收集整理的Android平台RTSP轻量级服务|RTMP推送摄像头或屏幕之音频接口设计的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【深度学习】一文弄懂CNN及图像识别(P
- 下一篇: 前有教授被骗千万,后有某重点高校青年教师