Android平台RTMP推送端实现外部数据对接推送和录像
生活随笔
收集整理的這篇文章主要介紹了
Android平台RTMP推送端实现外部数据对接推送和录像
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
背景
好多開發者在做Android平臺RTMP推送對接的同時,除了編碼前的數據外,還有些外部編碼數據推送訴求,他們希望外部的編碼音視頻數據不止可以實現RTMP推送,還可以同時在推送端實時錄制下來,本文以我們(官方)Android平臺RTMP直播推送模塊為例,介紹下外部數據對接流程和數據錄制流程。
對接流程
開始推送
private boolean StartPush(){if (isPushing)return false;//relayStreamUrl = "rtmp://192.168.1.77/hls/stream1";if (relayStreamUrl == null) {Log.e(TAG, "StartPush URL is null...");return false;}if (!OpenPushHandle())return false;if ( libPublisher.SmartPublisherSetURL(publisherHandle, relayStreamUrl) != 0 ){Log.e(TAG, "StartPush failed!");}int startRet = libPublisher.SmartPublisherStartPublisher(publisherHandle);if( startRet != 0){Log.e(TAG, "Failed to call StartPublisher!");if(isRTSPPublisherRunning){libPublisher.SmartPublisherClose(publisherHandle);publisherHandle = 0;}return false;}isPushing = true;return true;}OpenPushHandle()實現
注意,如果對接外部編碼后的音視頻數據的話,調用SmartPublisherOpen()接口時,記得audio_opt和video_opt均傳2。
private boolean OpenPushHandle(){if(publisherHandle != 0){return true;}int audio_opt = 2;int video_opt = 2;int videoWidth = 640;int videoHeight = 480;publisherHandle = libPublisher.SmartPublisherOpen(myContext, audio_opt, video_opt,videoWidth, videoHeight);if (publisherHandle == 0 ){Log.e(TAG, "OpenPushHandle failed!");return false;}Log.i(TAG, "publisherHandle=" + publisherHandle);libPublisher.SetSmartPublisherEventCallbackV2(publisherHandle, new EventHandePublisherV2());return true;}停止推送
public void StopPush(){if (!isPushing)return;isPushing = false;libPublisher.SmartPublisherStopPublisher(publisherHandle);if(!isRTSPPublisherRunning && !isRTSPServiceRunning){libPublisher.SmartPublisherClose(publisherHandle);publisherHandle = 0;}}實時音視頻數據投遞
如果需要同時錄制外部編碼后的音視頻數據,分別用以下接口完成數據投遞:
涉及到的sps、pps或者audio的一些配置信息,上層很容易拿到,傳遞下去即可。
/*** 設置編碼后視頻數據(H.264),如需錄制編碼后的數據,用此接口,且設置實際寬高** @param codec_id, H.264對應 1** @param data 編碼后的video數據**@param offset data的偏移** @param size data length** @param is_key_frame 是否I幀, if with key frame, please set 1, otherwise, set 0.** @param timestamp video timestamp** @param pts Presentation Time Stamp, 顯示時間戳** @param width, height: 編碼后視頻寬高** @return {0} if successful*/public native int SmartPublisherPostVideoEncodedDataV3(long handle, int codec_id,ByteBuffer data, int offset, int size,int is_key_frame, long timestamp, long pts,byte[] sps, int sps_len,byte[] pps, int pps_len,int width, int height);/*** 設置音頻數據(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);開始錄像
private boolean StartRecorder(){if (!OpenPullHandle())return false;ConfigRecorderFuntion();int iRecRet = libPlayer.SmartPlayerStartRecorder(playerHandle);if (iRecRet != 0) {Log.e(TAG, "StartRecorder failed!");if ( !isPulling &&!isPlaying && !isPushing && !isRTSPPublisherRunning){libPlayer.SmartPlayerClose(playerHandle);playerHandle = 0;}return false;}isRecording = true;return true;}停止錄像
private void StopRecorder(){if ( !isRecording )return;isRecording = false;libPlayer.SmartPlayerStopRecorder(playerHandle);if ( !isPlaying && !isPulling && !isPushing && !isRTSPPublisherRunning){libPlayer.SmartPlayerClose(playerHandle);playerHandle = 0;}}總結
外部數據對接的話,需要確保傳遞的音視頻數據編碼信息正常,相關的時間戳能對得上,從而確保好的用戶體驗。
總結
以上是生活随笔為你收集整理的Android平台RTMP推送端实现外部数据对接推送和录像的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【数据竞赛】时间序列竞赛炸榜技巧
- 下一篇: 【学术相关】11 个好用的科研工具推荐!