日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android平台RTMP推送端实现外部数据对接推送和录像

發布時間:2025/3/12 Android 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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推送端实现外部数据对接推送和录像的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。