技术背景

好多了解我们模块的开发者都知道,我们有非常成熟的轻量级RTSP服务模块,可以采集摄像头或屏幕的数据,编码打包注入Android平台的轻量级RTSP服务模块,让Android设备端,充当个类似于网络摄像头的角色,对外提供个RTSP拉流的URL,实现内网环境下的无服务部署直播场景,这种在内网监控或智慧教室、无纸化场景等,非常实用。

技术实现

今天要探讨的是,如何把外部的RTSP|RTMP流,注入到轻量级RTSP服务?实际上,这块对大牛直播SDK来说,算不上新模块或技术,因为前些年已经实现了,对应的是我们的内网RTSP网关模块。

Android平台如何拉取RTSP|RTMP流并转发至轻量级RTSP服务?_安卓端RTSP

实现方式,和RTSP转RTMP推送有些类似,先把RTSP或RTMP流,拉取下来,回调编码后的H.264/H.265/AAC/PCMU/PCMA数据到上层。

上层模块,通过轻量级RTSP服务模块提供的编码后数据投递接口,实现数据源的对接。

Android平台如何拉取RTSP|RTMP流并转发至轻量级RTSP服务?_大牛直播SDK_02

先说拉取RTSP或RTMP流数据,并回调到上层:

/* SmartRelayDemo.java
 * Created by daniusdk.com
 */
class ButtonPullListener implements View.OnClickListener {
          
	public void onClick(View v) {
          
		if (stream_player_.is_pulling()) {
          
			Log.i(TAG, "Stop Pull..");

			boolean iRet = stream_player_.StopPull();

			if (!iRet) {
          
				Log.e(TAG, "Call StopPull failed..");
				return;
			}

			stream_player_.try_release();
			btnPullStream.setText("开始拉流");
		} else {
          
			Log.i(TAG, "Start playback stream++");

			if (!stream_player_.OpenPlayerHandle(playback_url_, play_buffer_, is_using_tcp_))
				return;

			if(audio_opt_ == 2)
			{
          
				libPlayer.SmartPlayerSetAudioDataCallback(stream_player_.get(), new PlayerAudioDataCallback(stream_publisher_));
			}
			if(video_opt_ == 2)
			{
          
				libPlayer.SmartPlayerSetVideoDataCallback(stream_player_.get(), new PlayerVideoDataCallback(stream_publisher_));
			}

			int is_pull_trans_code = 1;
			boolean iPlaybackRet = stream_player_.StartPull(is_pull_trans_code);
			if (!iPlaybackRet) {
          
				Log.e(TAG, "Call StartPlayer failed..");
				return;
			}

			btnPullStream.setText("停止拉流");
		}
	}
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.