Android 播放Rtmp流 的3种不同方式的demo
时间: 2024-03-20 09:42:59 浏览: 16
好的,以下是三种不同方式的 Android 播放 Rtmp 流的 demo:
1. 使用 Vitamio
Vitamio 是一个支持多种视频格式的 Android 播放器,它也支持播放 RTMP 流。使用 Vitamio 播放 RTMP 流需要先下载 Vitamio SDK,并在项目中引用。
示例代码:
```java
import io.vov.vitamio.MediaPlayer;
import io.vov.vitamio.Vitamio;
import io.vov.vitamio.widget.VideoView;
public class MainActivity extends AppCompatActivity implements MediaPlayer.OnInfoListener, MediaPlayer.OnBufferingUpdateListener {
private VideoView videoView;
private String rtmpUrl = "rtmp://your.rtmp.url";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Vitamio.isInitialized(getApplicationContext());
setContentView(R.layout.activity_main);
videoView = findViewById(R.id.video_view);
videoView.setVideoPath(rtmpUrl);
videoView.setOnInfoListener(this);
videoView.setOnBufferingUpdateListener(this);
videoView.start();
}
@Override
public boolean onInfo(MediaPlayer mp, int what, int extra) {
switch (what) {
case MediaPlayer.MEDIA_INFO_BUFFERING_START:
// Show loading spinner
break;
case MediaPlayer.MEDIA_INFO_BUFFERING_END:
// Hide loading spinner
break;
}
return true;
}
@Override
public void onBufferingUpdate(MediaPlayer mp, int percent) {
// Update loading spinner progress
}
}
```
2. 使用 ExoPlayer
ExoPlayer 是 Google 推出的一个支持多种格式的 Android 播放器,它也支持播放 RTMP 流。使用 ExoPlayer 播放 RTMP 流需要先下载 ExoPlayer SDK,并在项目中引用。
示例代码:
```java
import com.google.android.exoplayer2.ExoPlayer;
import com.google.android.exoplayer2.ExoPlayerFactory;
import com.google.android.exoplayer2.PlaybackParameters;
import com.google.android.exoplayer2.SimpleExoPlayer;
import com.google.android.exoplayer2.source.ExtractorMediaSource;
import com.google.android.exoplayer2.source.MediaSource;
import com.google.android.exoplayer2.source.ProgressiveMediaSource;
import com.google.android.exoplayer2.trackselection.DefaultTrackSelector;
import com.google.android.exoplayer2.trackselection.TrackSelector;
import com.google.android.exoplayer2.ui.PlayerView;
import com.google.android.exoplayer2.upstream.DataSource;
import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory;
import com.google.android.exoplayer2.upstream.DefaultHttpDataSourceFactory;
import com.google.android.exoplayer2.upstream.DefaultRawResourceDataSourceFactory;
import com.google.android.exoplayer2.upstream.DataSource.Factory;
import com.google.android.exoplayer2.util.Util;
public class MainActivity extends AppCompatActivity {
private PlayerView playerView;
private String rtmpUrl = "rtmp://your.rtmp.url";
private SimpleExoPlayer player;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
playerView = findViewById(R.id.player_view);
player = ExoPlayerFactory.newSimpleInstance(this, new DefaultTrackSelector());
DataSource.Factory dataSourceFactory = new DefaultHttpDataSourceFactory(Util.getUserAgent(this, "your-application-name"));
MediaSource videoSource = new ExtractorMediaSource.Factory(dataSourceFactory).createMediaSource(Uri.parse(rtmpUrl));
player.prepare(videoSource);
player.setPlayWhenReady(true);
playerView.setPlayer(player);
}
@Override
protected void onDestroy() {
super.onDestroy();
player.release();
}
}
```
3. 使用 ffmpeg
ffmpeg 是一个开源的音视频处理库,它也支持播放 RTMP 流。使用 ffmpeg 播放 RTMP 流需要先下载 ffmpeg 库,并在项目中引用。
示例代码:
```java
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.view.SurfaceView;
import android.view.View;
import android.widget.Button;
import androidx.appcompat.app.AppCompatActivity;
import com.arthenica.mobileffmpeg.Config;
import com.arthenica.mobileffmpeg.ExecuteCallback;
import com.arthenica.mobileffmpeg.ExecuteException;
import com.arthenica.mobileffmpeg.FFmpeg;
import com.arthenica.mobileffmpeg.FFprobe;
public class MainActivity extends AppCompatActivity {
private SurfaceView surfaceView;
private String rtmpUrl = "rtmp://your.rtmp.url";
private String[] cmd = {"-rtmp_live", "live", "-i", rtmpUrl, "-c:v", "copy", "-c:a", "aac", "-strict", "-2", "-f", "flv", "-"};
private boolean isPlaying = false;
private Handler handler = new Handler(Looper.getMainLooper());
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
surfaceView = findViewById(R.id.surface_view);
Button playButton = findViewById(R.id.play_button);
playButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (isPlaying) {
stopPlaying();
playButton.setText("Play");
} else {
startPlaying();
playButton.setText("Stop");
}
}
});
}
private void startPlaying() {
Config.enableStatisticsCallback(new ExecuteCallback() {
@Override
public void apply(long executionId, int returnCode) {
handler.post(new Runnable() {
@Override
public void run() {
// Update statistics
}
});
}
});
FFmpeg.executeAsync(cmd, new ExecuteCallback() {
@Override
public void apply(long executionId, int returnCode) {
isPlaying = false;
}
});
isPlaying = true;
}
private void stopPlaying() {
FFmpeg.cancel();
isPlaying = false;
}
}
```
以上是三种不同方式的 Android 播放 Rtmp 流的 demo,希望对你有所帮助。