安卓實現視頻直播(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就可以了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章