这里总结一下视频直播流播放的相关知识。顺便也整理一下如何获取一个视频的地址,网上找了一下很多央视和卫视的地址都已经失效了。
VLC-Android
很遗憾github上官方 VLC-Android 上看了半天没看明白怎么用。。。这篇文章比较一目了然:Android使用VLC播放视频和直播流 效果图:
这里我也整理一下用法:
implementation 'org.videolan.android:libvlc-all:3.3.5'
下载后将 libvlc 文件夹放入app的同级目录下:
VideoPlayActivity 类,使用了一个工具类: implementation 'com.blankj:utilcodex:1.31.0'
public class VideoPlayActivity extends AppCompatActivity {
private LibVLC mLibVLC = null;
private MediaPlayer mMediaPlayer = null;
private SurfaceView textureView;
String str_url;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textureView = findViewById(R.id.texture_video);
str_url = getIntent().getStringExtra("url").toString();
}
@Override
protected void onDestroy() {
super.onDestroy();
mMediaPlayer.release();
mLibVLC.release();
}
@Override
protected void onStart() {
super.onStart();
final ArrayList args = new ArrayList<>();//VLC参数
args.add("--rtsp-tcp");//强制rtsp-tcp,加快加载视频速度
args.add("--aout=opensles");
args.add("--audio-time-stretch");
//args.add("--sub-source=marq{marquee=\"%Y-%m-%d,%H:%M:%S\",position=10,color=0xFF0000,size=40}");//这行是可以再vlc窗口右下角添加当前时间的
args.add("-vvv");
mLibVLC = new LibVLC(this, args);
mMediaPlayer = new MediaPlayer(mLibVLC);
Rect surfaceFrame = textureView.getHolder().getSurfaceFrame();
//设置vlc视频铺满布局
mMediaPlayer.getVLCVout().setWindowSize(ScreenUtils.getScreenWidth(), ScreenUtils.getScreenHeight());//宽,高 播放窗口的大小
// mMediaPlayer.setAspectRatio(ScreenUtils.getScreenWidth() + ":" + ScreenUtils.getScreenHeight());//宽,高 画面大小
mMediaPlayer.setScale(0);//这行必须加,为了让视图填满布局
//添加视图
IVLCVout vout = mMediaPlayer.getVLCVout();
vout.setVideoView(textureView);
vout.attachViews();
// String str_url = "https://qywapp.oss-cn-beijing.aliyuncs.com/2022/7/18/oss06ac675d-c493-2121-cfba-e5d627210036.mp4";
//String str_url="rtsp://admin:hhll@192.168.8.166:554/Streaming/Channels/102";
//String str_url = "https://media.w3.org/2010/05/sintel/trailer.mp4";
//美国
// String str_url = "rtmp://media3.scctv.net/live/scctv_800";
//韩国
// String str_url = "rtmp://mobliestream.c3tv.com:554/live/goodtv.sdp";
// String str_url = "https://v.kuaishou.com/wwZ3v9";
Uri uri = Uri.parse(str_url);//rtsp流地址或其他流地址//"https://media.w3.org/2010/05/sintel/trailer.mp4"
final Media media = new Media(mLibVLC, uri);
int cache = 10;
media.addOption(":network-caching=" + cache);
media.addOption(":file-caching=" + cache);
media.addOption(":live-cacheing=" + cache);
media.addOption(":sout-mux-caching=" + cache);
media.addOption(":codec=mediacodec,iomx,all");
mMediaPlayer.setMedia(media);//
media.setHWDecoderEnabled(false, false);//设置后才可以录制和截屏,这行必须放在mMediaPlayer.setMedia(media)后面,因为setMedia会设置setHWDecoderEnabled为true
mMediaPlayer.setEventListener(new MediaPlayer.EventListener() {
@Override
public void onEvent(MediaPlayer.Event event) {
// System.out.println("MainActivity.onEvent 111");
if (event.type == MediaPlayer.Event.Playing) {
System.out.println("MainActivity.onEvent 正在播放");
} else if (event.type == MediaPlayer.Event.Paused) {
System.out.println("MainActivity.onEvent Paused");
} else if (event.type == MediaPlayer.Event.Opening) {
System.out.println("MainActivity.onEvent Opening");
} else if (event.type == MediaPlayer.Event.Stopped) {
System.out.println("MainActivity.onEvent Stopped");
} else if (event.type == MediaPlayer.Event.Vout) {
System.out.println("MainActivity.onEvent getVoutCount=" + event.getVoutCount());
//mHandler.sendEmptyMessageDelayed(UPDATE_SCREEN, 1000);
} else {
System.out.println("MainActivity.onEvent else ");
}
}
});
mMediaPlayer.play();
}
@Override
protected void onStop() {
super.onStop();
mMediaPlayer.stop();
mMediaPlayer.detachViews();
}
}
布局文件:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".VideoPlayActivity">
<SurfaceView
android:id="@+id/texture_video"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</FrameLayout>
获取直播流地址
代码中我也罗列了几个直播流的地址,不过可能都不能用的。下面我就说说咱们如何自己获取: 我们使用google浏览器访问下面任意地址:
【CCTV】
超高清4K:https://m.yangshipin.cn/video?type=1&vid=2000266303&pid=600002264
CCTV1:https://m.yangshipin.cn/video?type=1&vid=2000210103&pid=600001859
CCTV2:https://m.yangshipin.cn/video?type=1&vid=2000203603&pid=600001800
CCTV3:https://m.yangshipin.cn/video?type=1&vid=2000203803&pid=600001801
CCTV4:https://m.yangshipin.cn/video?type=1&vid=2000204803&pid=600001814
CCTV5:https://m.yangshipin.cn/video?type=1&vid=2000205103&pid=600001818
CCTV5+:https://m.yangshipin.cn/video?type=1&vid=2000204503&pid=600001817
CCTV6:https://m.yangshipin.cn/video?type=1&vid=2000203303&pid=600001802
CCTV7:https://m.yangshipin.cn/video?type=1&vid=2000510003&pid=600004092
CCTV8:https://m.yangshipin.cn/video?type=1&vid=2000203903&pid=600001803
CCTV9:https://m.yangshipin.cn/video?type=1&vid=2000499403&pid=600004078
CCTV10:https://m.yangshipin.cn/video?type=1&vid=2000203503&pid=600001805
CCTV11:https://m.yangshipin.cn/video?type=1&vid=2000204103&pid=600001806
CCTV12:https://m.yangshipin.cn/video?type=1&vid=2000202603&pid=600001807
CCTV13:https://m.yangshipin.cn/video?type=1&vid=2000204603&pid=600001811
CCTV14:https://m.yangshipin.cn/video?type=1&vid=2000204403&pid=600001809
CCTV15:https://m.yangshipin.cn/video?type=1&vid=2000205003&pid=600001815
cctv4址为例,访问后按F12进入开发这模式:
然后点击左小角的播放按钮:
最后我们复制这个链接即可,复制到.m3u8 位置就行。
注意:我们这里只是获取了一个视频的片段,过个几分钟链接就失效了,需要重新获取!