Android平台RTSP轻量级服务|RTMP推送摄像头或屏幕之音频接口设计
好多開發者在做Android平臺錄像或者RTSP輕量級服務、RTMP推送相關模塊時,對需要設計哪些常用接口會心存疑惑,本文主要以大牛直播SDK(官方)為例,簡單介紹下Android平臺直播推送SDK所有音頻相關的接口,感興趣的開發者可以看看。
1. 設置audio編碼類型,默認AAC,如需更低的碼率,可設置SPEEX編碼,一把考慮到錄像等操作的通用性,建議選擇AAC編碼。
/*** Set audio encoder type(設置音頻編碼類型)* * @param type: if with 1:AAC, if with 2: SPEEX* * @return {0} if successful*/public native int SmartPublisherSetAudioCodecType(long handle, int type);2. 設置AAC音頻編碼碼率,不再贅述。
/*** Set audio encoder bit-rate(設置音頻編碼碼率), 當前只對AAC編碼有效** @param kbit_rate: 碼率(單位是kbps), 如果是0的話將使用默認碼率, 必須大于等于0** @return {0} if successful*/public native int SmartPublisherSetAudioBitRate(long handle, int kbit_rate);3. 設置SPEEX音頻編碼質量,一般設置到8即可。
/*** Set speex encoder quality(設置speex編碼質量)* * @param quality: range with (0, 10), default value is 8* * @return {0} if successful*/public native int SmartPublisherSetSpeexEncoderQuality(long handle, int quality);4. 設置噪音抑制,噪音抑制可用于對采集到的audio數據如雜音背景音的消除
/*** Set Audio Noise Suppression(設置音頻噪音抑制)* * @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. 設置音頻自動增益控制,AGC的目的是,系統可根據聲音大小自動適當調整音量,使聲音大小盡量保持一致
/*** Set Audio AGC(設置音頻自動增益控制)* * @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. 設置回音消除,用于一對一互動場景下,消除音頻回音
/*** Set Audio Echo Cancellation(設置音頻回音消除)** @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. 設置混音,可用于比如兩路音頻混音場景,具體可參考一對一互動的demo
/*** 設置混音,目前支持兩路音頻混音** @param is_mix: 1混音, 0不混音, 默認不混音** @return {0} if successful*/public native int SmartPublisherSetAudioMix(long handle, int is_mix);8. 實時靜音,實時靜音顧名思義,推送過程中,暫停音頻推送
/*** Set mute or not during publish stream(設置實時靜音)* * @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. 用于設置輸入音量,范圍是[0.0, 5.0],除非麥克風采集到的audio過小,一般不建議放大,放大的話,會引入噪音等
/*** 設置輸入音量, 這個接口一般不建議調用, 在一些特殊情況下可能會用, 一般不建議放大音量** @param index: 一般是0和1, 如果沒有混音的只用0, 有混音的話, 0,1分別設置音量** @param volume: 音量,默認是1.0,范圍是[0.0, 5.0], 設置成0靜音, 1音量不變** @return {0} if successful*/public native int SmartPublisherSetInputAudioVolume(long handle, int index, float volume);10. 對接外部實時采集的PCM數據,考慮到集成方便,我們提供了以下三個接口,注意PCM音頻數據接口每10ms傳第一次audio數據
/*** 傳遞PCM音頻數據給SDK, 每10ms音頻數據傳入一次* * @param pcmdata: pcm數據, 需要使用ByteBuffer.allocateDirect分配, ByteBuffer.isDirect()是true的才行.* @param size: pcm數據大小* @param sample_rate: 采樣率,當前只支持{44100, 8000, 16000, 24000, 32000, 48000}, 推薦44100* @param channel: 通道, 當前通道支持單通道(1)和雙通道(2),推薦單通道(1)* @param per_channel_sample_number: 這個請傳入的是 sample_rate/100*/public native int SmartPublisherOnPCMData(long handle, ByteBuffer pcmdata, int size, int sample_rate, int channel, int per_channel_sample_number);/*** 傳遞PCM音頻數據給SDK, 每10ms音頻數據傳入一次** @param pcmdata: pcm數據, 需要使用ByteBuffer.allocateDirect分配, ByteBuffer.isDirect()是true的才行.* @param offset: pcmdata的偏移* @param size: pcm數據大小* @param sample_rate: 采樣率,當前只支持{44100, 8000, 16000, 24000, 32000, 48000}, 推薦44100* @param channel: 通道, 當前通道支持單通道(1)和雙通道(2),推薦單通道(1)* @param per_channel_sample_number: 這個請傳入的是 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音頻數據給SDK, 每10ms音頻數據傳入一次** @param pcm_short_array: pcm數據, short是native endian order* @param offset: 數組偏移* @param len: 數組項數* @param sample_rate: 采樣率,當前只支持{44100, 8000, 16000, 24000, 32000, 48000}, 推薦44100* @param channel: 通道, 當前通道支持單通道(1)和雙通道(2),推薦單通道(1)* @param per_channel_sample_number: 這個請傳入的是 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. 設置傳遠端數據,主要用于一對一環境下,拉流端拉到的audio,回調上來,通過推送端這個接口設置下去,完成整體的回音消除
/*** 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混音音頻數據接口,注意,每10ms音頻數據傳入一次
/*** 傳遞PCM混音音頻數據給SDK, 每10ms音頻數據傳入一次** @param stream_index: 當前只能傳1, 傳其他返回錯誤* @param pcm_data: pcm數據, 需要使用ByteBuffer.allocateDirect分配, ByteBuffer.isDirect()是true的才行.* @param offset: pcmdata的偏移* @param size: pcm數據大小* @param sample_rate: 采樣率,當前只支持{44100, 8000, 16000, 24000, 32000, 48000}* @param channels: 通道, 當前通道支持單通道(1)和雙通道(2)* @param per_channel_sample_number: 這個請傳入的是 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混音音頻數據給SDK, 每10ms音頻數據傳入一次** @param stream_index: 當前只能傳1, 傳其他返回錯誤* @param pcm_short_array: pcm數據, short是native endian order* @param offset: 數組偏移* @param len: 數組項數* @param sample_rate: 采樣率,當前只支持{44100, 8000, 16000, 24000, 32000, 48000}* @param channels: 通道, 當前通道支持單通道(1)和雙通道(2)* @param per_channel_sample_number: 這個請傳入的是 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數據對接,主要是轉發模塊使用
/*** 設置音頻數據(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數據** @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);/*** 設置音頻數據(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數據** @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);/*** 設置音頻數據(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數據** @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 通道數, 如果需要錄像的話必須傳正確的值, 一般是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. 用于編碼后的音頻數據回調,方便對接第三方系統
/*** Start output Encoded Data(用于編碼后的音視頻數據回調)** @return {0} if successful*/public native int SmartPublisherStartOutputEncodedData(long handle);/*** Stop output Encoded Data** @return {0} if successful*/public native int SmartPublisherStopOutputEncodedData(long handle);總結
細數下來,光audio相關的接口也有20個,可見開發個Android平臺RTMP直播推送模塊多么麻煩,當然因為本文提到的RTMP推送,實際使用的公司或開發者群體比較大,如果只是項目需求,好多是用不到的,可以適當精簡,做個小而美的模塊,不失是個很好的選擇。
總結
以上是生活随笔為你收集整理的Android平台RTSP轻量级服务|RTMP推送摄像头或屏幕之音频接口设计的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【深度学习】一文弄懂CNN及图像识别(P
- 下一篇: 前有教授被骗千万,后有某重点高校青年教师