android 自定义推流器,Android直播实现 Android端推流、播放
最近想實(shí)現(xiàn)一個(gè)Android直播,但是對(duì)于這方面的資料都比較零碎,一開始是打算用ffmpeg來實(shí)現(xiàn)編碼推流,在搜集資料期間,找到了幾個(gè)強(qiáng)大的開源庫,直接避免了jni的代碼,集成后只用少量的java代碼就可實(shí)現(xiàn)編碼、推流和取流播放,整理了一下做了一個(gè)demo,在這里記錄一下
效果圖:
編碼和推流,有兩個(gè)方案選擇:
一:
使用javacv來實(shí)現(xiàn),最終也是用過ffmpeg來進(jìn)行編碼和推流,javacv實(shí)現(xiàn)到可以直接接收攝像頭的幀數(shù)據(jù)
需要自己實(shí)現(xiàn)的代碼只是打開攝像頭,寫一個(gè)SurfaceView進(jìn)行預(yù)覽,然后實(shí)現(xiàn)PreviewCallback將攝像頭每一幀的數(shù)據(jù)交給javacv即可
javacv地址:https://github.com/bytedeco/javacv
demo地址:https://github.com/beautifulSoup/RtmpRecoder/tree/master
二:
使用Android自帶的編碼工具,可實(shí)現(xiàn)硬編碼,這里有一個(gè)國內(nèi)大神開源的封裝很完善的的庫yasea,第一種方法需要實(shí)現(xiàn)的Camera采集部分也一起封裝好了,進(jìn)行一些簡單配置就可以實(shí)現(xiàn)編碼推流,并且yasea目前已經(jīng)直接支持?jǐn)z像頭的熱切換,和各種濾鏡效果
yasea地址(內(nèi)置demo):https://github.com/begeekmyfriend/yasea
服務(wù)器
流媒體服務(wù)器我用的是srs,項(xiàng)目地址:https://github.com/ossrs/srs
關(guān)于srs的編譯、配置、部署、在官方wiki中已經(jīng)寫的很詳細(xì)了,并且srs同樣是國內(nèi)開發(fā)人員開源的項(xiàng)目,有全中文的文檔,看起來很方便
這里有最基本的簡單編譯部署過程?Android直播實(shí)現(xiàn)(二)srs流媒體服務(wù)器部署
播放器
android端的播放使用vitamio,還是國內(nèi)的開源播放器,是不是感覺國內(nèi)的前輩們?cè)絹碓綄帕薧~^!
vitamio支持幾乎所有常見的的視頻格式和流媒體協(xié)議
vitamio地址(內(nèi)置demo):https://github.com/yixia/VitamioBundle
這里使用的是yaesa庫,先介紹一下直播實(shí)現(xiàn)的流程:
一:使用yaesa進(jìn)行攝像頭采集、編碼然后向srs服務(wù)器rtmp推流
二:部署srs流媒體服務(wù)器
三:使用vitamio取流播放
編碼和推流已經(jīng)整合在一起,demo地址:https://github.com/SiKang123/LiveTest
yaesa推流:
首先 clone yesa源碼,導(dǎo)入library庫
//布局文件中實(shí)現(xiàn)
.ossrs.yasea.SrsCameraView
android:id="@+id/glsurfaceview_camera"
android:layout_width="match_parent" android:layout_height="match_parent"/>
//java代碼 需要實(shí)現(xiàn)接口 implements SrsEncodeHandler.SrsEncodeListener, RtmpHandler.RtmpListener, SrsRecordHandler.SrsRecordListener
SrsCameraView cameraView = (SrsCameraView) findViewById(R.id.glsurfaceview_camera)
mPublisher = new SrsPublisher(cameraView);
//編碼狀態(tài)回調(diào)
mPublisher.setEncodeHandler(new SrsEncodeHandler(this)); mPublisher.setRecordHandler(new SrsRecordHandler(this)); //rtmp推流狀態(tài)回調(diào) mPublisher.setRtmpHandler(new RtmpHandler(this)); //預(yù)覽分辨率 mPublisher.setPreviewResolution(1280, 720); //推流分辨率 mPublisher.setOutputResolution(720, 1280); //傳輸率 mPublisher.setVideoHDMode(); //開啟美顏(其他濾鏡效果在MagicFilterType中查看) mPublisher.switchCameraFilter(MagicFilterType.BEAUTY); //打開攝像頭,開始預(yù)覽(未推流) mPublisher.startCamera(); //mPublisher.switchToSoftEncoder();//選擇軟編碼 mPublisher.switchToHardEncoder();//選擇硬編碼 //開始推流 rtmpUrl(ip換成服務(wù)器的部署ip):"rtmp://192.168.31.126/android/teststream" mPublisher.startPublish(rtmpUrl);
關(guān)鍵代碼就這么幾句(狀態(tài)回調(diào)有很多這里就不貼了,可以看demo),剩下的交給yasea,編碼推流就搞定了,是不是簡單到懷疑人生?
vitamio取流播放
首先還是clone vitamio的源碼,導(dǎo)入vitamio庫
/*首先不要忘了在Manifest里注冊(cè)InitActivity*/
"io.vov.vitamio.activity.InitActivity"
android:configChanges="orientation|screenSize|smallestScreenSize|keyboard|keyboardHidden|navigation"
android:launchMode="singleTop"
android:theme="@android:style/Theme.NoTitleBar" android:windowSoftInputMode="stateAlwaysHidden" /> /*布局文件*/ .vov.vitamio.widget.VideoView android:id="@+id/surface_view" android:layout_width="wrap_content" android:layout_height="wrap_content" />
/*java代碼*/
/*onCreate中,用于檢查vitamioLibs庫是否準(zhǔn)備完成
*如果Manifest中沒有初始化InitActivity,這里會(huì)返回false,并自動(dòng)初始化InitActivity
*/
if (!LibsChecker.checkVitamioLibs(this))
return;
VideoView mVideoView=(VideoView) findViewById(R.id.surface_view); /*會(huì)有幾秒延時(shí)*/ mVideoView.setVideoPath(rtmpUrl);
然后就可以開始愉快的播放rtmp流了,是不是簡單到令人發(fā)指?
關(guān)鍵代碼就這么多,具體代碼可以看看demo:https://github.com/SiKang123/LiveTest
移動(dòng)端的編碼、推流、和播放就到這,后面會(huì)介紹一下srs的部署
srs流媒體服務(wù)器部署
前面介紹了Android端的編碼、推流和播放
Android直播實(shí)現(xiàn)(一)Android端推流、播放
但是作為android程序員,寫好了推流器和播放器,沒有服務(wù)器來測(cè)試還是很頭疼的,這里就介紹一下srs服務(wù)器的最簡單的部署,如果有興趣深入研究的可以去看看官方的wiki,因?yàn)槭菄鴥?nèi)開發(fā)人員開源的,提供中文文檔,講解的很詳細(xì)?https://github.com/ossrs/srs/wiki/v3_CN_Home
編譯:
官方推薦在CentOs 6.x 和 Ubuntu12.x下編譯,為了避免不必要的麻煩,我直接在Ububtu 12.04.5上進(jìn)行編譯和部署的
首先clone srs源碼
git clone https://github.com/ossrs/srs
cd srs/trunk
然后進(jìn)行編譯
./configure --rtmp-hls --with-http-api --with-ffmpeg && make //--rtmp-hls:開啟ssl/hls,其他功能都處于關(guān)閉狀態(tài)。 //--with-http-api:開啟http api接口。 //--with-ffmpeg:開啟FFMPEG
這里只編譯了基礎(chǔ)功能,更詳細(xì)的配置可以看:https://github.com/ossrs/srs/wiki/v1_CN_Build
編譯完之后啟動(dòng)就可以了
//啟動(dòng)時(shí)也可以自定義去配置,制定一個(gè)conf文件就可以了,這里用現(xiàn)成的rtmp.conf來啟動(dòng)
./objs/srs -c conf/rtmp.conf
如果沒報(bào)錯(cuò),這個(gè)時(shí)候服務(wù)器就已經(jīng)啟動(dòng)了,把Android推流和播放端的ip地址,改成srs部署的ip就可以實(shí)現(xiàn)直播了(注意:如果是用虛擬機(jī),要把網(wǎng)絡(luò)模式換位橋接模式,讓虛擬機(jī)擁有獨(dú)立的ip,否則主系統(tǒng)可以訪問到srs,但局域網(wǎng)內(nèi)的手機(jī)是訪問不到的)
為了測(cè)試srs是否已經(jīng)成功啟動(dòng),可以先用ffmpeg 對(duì)一個(gè)本地視頻文件進(jìn)行推流,srs的/doc/下有測(cè)試的flv文件,直接用ffmpeg進(jìn)行推流
//ip地址換成自己部署的ip
sudo ./objs/ffmpeg/bin/ffmpeg -re -i ./doc/source.200kbps.768x320.flv \-vcodec copy \-f flv -y rtmp://192.168.31.126/srstest/teststream
不出意外的話在終端中就應(yīng)該開始一幀一幀的推流了:
這樣就推流成功了,然后用srs的在線播放器試一下能否觀看
http://winlinvip.github.io/srs.release/trunk/research/players/srs_player.html
服務(wù)器啟動(dòng)以后,把Android推流和播放端的ip改為服務(wù)器的部署ip,就可以開始直播了
如果沒有成功,可以利用srs在線播放器來幫助測(cè)試:
1.測(cè)試推流可以在Android上向服務(wù)器推流,用srs在線播放,播放成功推流就沒問題了
2.測(cè)試播放可以像上邊一樣,先用ffmpeg推流一個(gè)視頻文件,在Android端播放
總結(jié)
以上是生活随笔為你收集整理的android 自定义推流器,Android直播实现 Android端推流、播放的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 趣学python3(29)-集合set
- 下一篇: android 聊天功能实现,Andro