【Android直播流加载】

这里总结一下视频直播流播放的相关知识。顺便也整理一下如何获取一个视频的地址,网上找了一下很多央视和卫视的地址都已经失效了。

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>

参考文章:

Android使用VLC播放摄像头RTSP流

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一: 使用javacv来实现,最终也是用过ffmpeg来进行编码和推,javacv实现到可以直接接收摄像头的帧数据 需要自己实现的代码只是打开摄像头,写一个SurfaceView进行预览,然后实现PreviewCallback将摄像头每一帧的数据交给javacv即可 javacv地址:https://github.com/bytedeco/javacv demo地址:https://github.com/beautifulSoup/RtmpRecoder/tree/master 二: 使用Android自带的编码工具,可实现硬编码,这里有一个国内大神开源的封装很完善的的库yasea,第一种方法需要实现的Camera采集部分也一起封装好了,进行一些简单配置就可以实现编码推,并且yasea目前已经直接支持摄像头的热切换,和各种滤镜效果 yasea地址(内置demo):https://github.com/begeekmyfriend/yasea 服务器 媒体服务器我用的是srs,项目地址:https://github.com/ossrs/srs 关于srs的编译、配置、部署、在官方wiki中已经写的很详细了,并且srs同样是国内开发人员开源的项目,有全中文的文档,看起来很方便 这里有最基本的简单编译部署过程 Android直播实现(二)srs媒体服务器部署 播放android端的播放使用vitamio,还是国内的开源播放器,是不是感觉国内的前辈们越来越屌了^~^! vitamio支持几乎所有常见的的视频格式和媒体协议 vitamio地址(内置demo):https://github.com/yixia/VitamioBundle 这里使用的是yaesa库,先介绍一下直播实现的程:

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值