安卓实现视频直播(rtmp)以及直播推流(NDK实现)

前言

想写关于NDK的文章很久了,但一直不知道该写点啥,该怎么写?正好公司有一个直播和播放的需求,那好吧,就造一个视频播放和视频直播的轮子吧。那说干就干!声明一下,本篇文章不会写怎样配置NDK等问题,只是大概介绍一下思路,具体代码已经放在Github上,大家可以下载代码自己进行定制或者直接引入进行使用。如果有幸帮到各位,那就请点一个Star,不胜感激。下面是具体使用方法:

引入依赖

首先在项目的build.gradle中添加以下代码:

allprojects {
		repositories {
			...
			maven { url 'https://jitpack.io' }
		}
	}

然后在需要使用的module的build.gradle中添加下面的依赖:

dependencies {
	      implementation 'com.github.zhujiang521:Player:1.0.1'
	}

视频播放

说起视频播放,就不得不提ffmpeg,大多数视频播放器都使用的是ffmpeg进行私有定制。本项目使用的也是ffmpeg。

项目中使用的不是动态库(.so),而是静态库(.a),这样做的好处是可以使项目大大减小,并且可以自己对代码进行修改。

实现思路大概是创建两个线程:一个用来不断获取视频信息、一个用来不断获取音频信息,然后通过相对比丢帧实现音视频同步。

太详细的代码也不在这里贴了,大家可以直接查看代码。下面说一下使用方法吧:

视频播放使用很简单,只需一行代码即可使用,不但可以播放直播流,还可以播放本地视频,在播放本地视频的时候还实现了seekBar的随意拖动,大家可以尝试一下:

 BroadcastLive.create(TVChannelActivity.this).setDataUrl("直播地址").build();

是不是很简单?下面给大家几个可以使用的rtmp直播流:

tvBeanList.add(new TVBean("测试本地视频","/sdcard/Pictures/test.mp4"));
        tvBeanList.add(new TVBean("香港卫视","rtmp://live.hkstv.hk.lxdns.com/live/hks1"));
        tvBeanList.add(new TVBean("香港财经","rtmp://202.69.69.180:443/webcast/bshdlive-pc"));
        tvBeanList.add(new TVBean("韩国GoodTV","rtmp://mobliestream.c3tv.com:554/live/goodtv.sdp"));
        tvBeanList.add(new TVBean("韩国朝鲜日报","rtmp://live.chosun.gscdn.com/live/tvchosun1.stream"));
        tvBeanList.add(new TVBean("美国1","rtmp://ns8.indexforce.com/home/mystream"));
        tvBeanList.add(new TVBean("美国2","rtmp://media3.scctv.net/live/scctv_800"));
        tvBeanList.add(new TVBean("美国中文电视","rtmp://media3.sinovision.net:1935/live/livestream"));
        tvBeanList.add(new TVBean("湖南卫视","rtmp://58.200.131.2:1935/livetv/hunantv"));

里面有的可能没法用了,湖南卫视、美国中文电视应该还可以,没有一一去验证,大家可以试试。

播放里面的实现类没有写太多的方法,大家可以自己实现。

直播推流

直播很常见,现在更是全民直播,哪个平台基本都有直播功能,上面有了直播播放当然也要有直播推流啊。推流的时候也分为视频和音频。大概实现过程就是将视频和音频压缩成编码发送到服务器,然后直播播放那边实时获取推上去的流,再进行音视频解码。

本项目中音频编码使用的是Open SL,视频编码使用的是H264,同上,这里也不多赘述具体实现代码,项目中都有,大家可以进入我的Github查看。

下面是使用直播推流的方法:

LiveRecording.create(this).setDataUrl("推流的地址")
                .setWidth(800)
                .setHeight(400)
                .setFps(10)
                .setBitrate(800_000)
                .build();

直播推流就比直播播放要多了几个方法,下面是方法的定义:

/**
         * 设置成像宽度
         * @param width
         * @return
         */
        public LiveRecordingModel setWidth(int width) {
            this.width = width;
            return this;
        }

        /**
         * 设置成像高度
         * @param height
         * @return
         */
        public LiveRecordingModel setHeight(int height) {
            this.height = height;
            return this;
        }

        /**
         * 设置直播比特率
         * @param bitrate
         * @return
         */
        public LiveRecordingModel setBitrate(int bitrate) {
            this.bitrate = bitrate;
            return this;
        }

        /**
         * 设置FPS值
         * @param fps
         * @return
         */
        public LiveRecordingModel setFps(int fps) {
            this.fps = fps;
            return this;
        }

总结

到这里这篇文章已经接近尾声了,也不知道怎么了,明明花了很久弄的项目,真正想写文章的时候却感觉不知道该如何下手,未来的几篇文章我想把直播推流和直播播放的c++代码拿出来写一写,包括在Android Studio中项目的配置、CMake的应用以及常见的NDK错误总结一下。希望大家能够喜欢。最后和大家说声抱歉,我在导入jitpack的时候一直报错,之前上传的普通项目都是可以的,但是不知道为什么NDK项目不可以,大家有办法的可以在评论区告诉我,提前谢谢了,如果想使用的话可以直接进我的Github下载代码,直接复制paly(直播播放)和audio(直播推流)这两个module进行使用。

之前确实无法在JetPack生成链接,一直爆红,前两天有人在Github中给我提了Issues,说只有debug包可以用,在打Release包时报错,首先想到的就是build.gradle有问题,果不其然,改了之后打Release包就可以了,而且在JetPack中也能上传成功了,之后大家用的时候直接调用上面的Gradle就可以了。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论
RTMP(Real-Time Messaging Protocol)是一种流媒体协议,用于在互联网上实时传输音频、视频和数据。RTMP支持点播和直播两种模式,其中直播模式常用于视频直播和游戏直播等场景中。下面是RTMP直播推流的详细介绍: 1. 准备推流工具 推流工具可以将视频、音频等流媒体数据推送到RTMP服务器,常用的推流工具有 OBS、XSplit、FFmpeg 等。其中,OBS(Open Broadcaster Software)是一个开源的推流工具,易于使用且功能强大。 2. 获取RTMP推流地址 在推流之前,需要先获取RTMP服务器的推流地址,一般由直播平台提供。例如,在B站直播中,可以在直播间设置中获取推流地址。 3. 配置推流工具 将获取的RTMP推流地址填入推流工具的设置中,同时根据需要设置视频、音频等参数。例如,在OBS中,可以配置视频分辨率、视频码率、音频码率等参数。 4. 开始推流推流工具配置完成后,点击开始推流按钮,即可将流媒体数据推送到RTMP服务器。在推流过程中,可以通过推流工具的界面监控推流状态和推流质量等信息。 5. 直播播放 推流完成后,直播平台即可将推流视频、音频等流媒体数据转发给观众,观众即可通过直播平台观看直播。在直播过程中,可以通过直播平台的管理后台监控直播状态和观众数据等信息。 需要注意的是,在推流过程中,需要保证网络稳定和带宽充足,否则会影响推流质量和观看体验。另外,推流过程中也需要注意保护个人隐私和知识产权等问题。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

朱 江

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值