前言
想寫關於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就可以了。