Android直播實現 Android端推流、播放

最近想實現一個Android直播,可是對於這方面的資料都比較零碎,一開始是打算用ffmpeg來實現編碼推流,在蒐集資料期間,找到了幾個強大的開源庫,直接避免了jni的代碼,集成後只用少許的java代碼就可實現編碼、推流和取流播放,整理了一下作了一個demo,在這裏記錄一下php

效果圖: 
這裏寫圖片描述html

編碼和推流,有兩個方案選擇:java

一: 
使用javacv來實現,最終也是用過ffmpeg來進行編碼和推流,javacv實現到能夠直接接收攝像頭的幀數據 
須要本身實現的代碼只是打開攝像頭,寫一個SurfaceView進行預覽,而後實現PreviewCallback將攝像頭每一幀的數據交給javacv便可 
javacv地址:https://github.com/bytedeco/javacv 
demo地址:https://github.com/beautifulSoup/RtmpRecoder/tree/masterandroid

二: 
使用Android自帶的編碼工具,可實現硬編碼,這裏有一個國內大神開源的封裝很完善的的庫yasea,第一種方法須要實現的Camera採集部分也一塊兒封裝好了,進行一些簡單配置就能夠實現編碼推流,而且yasea目前已經直接支持攝像頭的熱切換,和各類濾鏡效果 
yasea地址(內置demo):https://github.com/begeekmyfriend/yaseagit

服務器程序員

流媒體服務器我用的是srs,項目地址:https://github.com/ossrs/srs 
關於srs的編譯、配置、部署、在官方wiki中已經寫的很詳細了,而且srs一樣是國內開發人員開源的項目,有全中文的文檔,看起來很方便 
這裏有最基本的簡單編譯部署過程 Android直播實現(二)srs流媒體服務器部署github

播放器api

android端的播放使用vitamio,仍是國內的開源播放器,是否是感受國內的前輩們愈來愈屌了^~^! 
vitamio支持幾乎全部常見的的視頻格式和流媒體協議 
vitamio地址(內置demo):https://github.com/yixia/VitamioBundle服務器

這裏使用的是yaesa庫,先介紹一下直播實現的流程: 
一:使用yaesa進行攝像頭採集、編碼而後向srs服務器rtmp推流 
二:部署srs流媒體服務器 
三:使用vitamio取流播放網絡

編碼和推流已經整合在一塊兒,demo地址:https://github.com/SiKang123/LiveTest


yaesa推流:

首先 clone yesa源碼,導入library庫

//佈局文件中實現
    <net.ossrs.yasea.SrsCameraView android:id="@+id/glsurfaceview_camera" android:layout_width="match_parent" android:layout_height="match_parent"/>
  •  
//java代碼 須要實現接口 implements SrsEncodeHandler.SrsEncodeListener, RtmpHandler.RtmpListener, SrsRecordHandler.SrsRecordListener SrsCameraView cameraView = (SrsCameraView) findViewById(R.id.glsurfaceview_camera) mPublisher = new SrsPublisher(cameraView); //編碼狀態回調 mPublisher.setEncodeHandler(new SrsEncodeHandler(this)); mPublisher.setRecordHandler(new SrsRecordHandler(this)); //rtmp推流狀態回調 mPublisher.setRtmpHandler(new RtmpHandler(this)); //預覽分辨率 mPublisher.setPreviewResolution(1280, 720); //推流分辨率 mPublisher.setOutputResolution(720, 1280); //傳輸率 mPublisher.setVideoHDMode(); //開啓美顏(其餘濾鏡效果在MagicFilterType中查看) mPublisher.switchCameraFilter(MagicFilterType.BEAUTY); //打開攝像頭,開始預覽(未推流) mPublisher.startCamera(); //mPublisher.switchToSoftEncoder();//選擇軟編碼 mPublisher.switchToHardEncoder();//選擇硬編碼 //開始推流 rtmpUrl(ip換成服務器的部署ip):"rtmp://192.168.31.126/android/teststream" mPublisher.startPublish(rtmpUrl);
  •  

關鍵代碼就這麼幾句(狀態回調有不少這裏就不貼了,能夠看demo),剩下的交給yasea,編碼推流就搞定了,是否是簡單到懷疑人生?


vitamio取流播放

首先仍是clone vitamio的源碼,導入vitamio庫

/*首先不要忘了在Manifest裏註冊InitActivity*/ <activity android:name="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" /> /*佈局文件*/ <io.vov.vitamio.widget.VideoView android:id="@+id/surface_view" android:layout_width="wrap_content" android:layout_height="wrap_content" />
  •  
/*java代碼*/ /*onCreate中,用於檢查vitamioLibs庫是否準備完成 *若是Manifest中沒有初始化InitActivity,這裏會返回false,並自動初始化InitActivity */ if (!LibsChecker.checkVitamioLibs(this)) return; VideoView mVideoView=(VideoView) findViewById(R.id.surface_view); /*會有幾秒延時*/ mVideoView.setVideoPath(rtmpUrl);
  •  

而後就能夠開始愉快的播放rtmp流了,是否是簡單到使人髮指?

關鍵代碼就這麼多,具體代碼能夠看看demo:https://github.com/SiKang123/LiveTest 
移動端的編碼、推流、和播放就到這,後面會介紹一下srs的部署

 

 

 srs流媒體服務器部署

前面介紹了Android端的編碼、推流和播放 
Android直播實現(一)Android端推流、播放

可是做爲android程序員,寫好了推流器和播放器,沒有服務器來測試仍是很頭疼的,這裏就介紹一下srs服務器的最簡單的部署,若是有興趣深刻研究的能夠去看看官方的wiki,由於是國內開發人員開源的,提供中文文檔,講解的很詳細 https://github.com/ossrs/srs/wiki/v3_CN_Home

編譯:

官方推薦在CentOs 6.x 和 Ubuntu12.x下編譯,爲了不沒必要要的麻煩,我直接在Ububtu 12.04.5上進行編譯和部署的

首先clone srs源碼

git clone https://github.com/ossrs/srs cd srs/trunk
  •  

而後進行編譯

./configure --rtmp-hls --with-http-api --with-ffmpeg && make //--rtmp-hls:開啓ssl/hls,其餘功能都處於關閉狀態。 //--with-http-api:開啓http api接口。 //--with-ffmpeg:開啓FFMPEG
  •  

這裏只編譯了基礎功能,更詳細的配置能夠看:https://github.com/ossrs/srs/wiki/v1_CN_Build

編譯完以後啓動就能夠了

//啓動時也能夠自定義去配置,制定一個conf文件就能夠了,這裏用現成的rtmp.conf來啓動 ./objs/srs -c conf/rtmp.conf 
  •  

若是沒報錯,這個時候服務器就已經啓動了,把Android推流和播放端的ip地址,改爲srs部署的ip就能夠實現直播了(注意:若是是用虛擬機,要把網絡模式換位橋接模式,讓虛擬機擁有獨立的ip,不然主系統能夠訪問到srs,但局域網內的手機是訪問不到的

爲了測試srs是否已經成功啓動,能夠先用ffmpeg 對一個本地視頻文件進行推流,srs的/doc/下有測試的flv文件,直接用ffmpeg進行推流

//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
  •  

不出意外的話在終端中就應該開始一幀一幀的推流了: 
這裏寫圖片描述

這樣就推流成功了,而後用srs的在線播放器試一下可否觀看 
http://winlinvip.github.io/srs.release/trunk/research/players/srs_player.html

這裏寫圖片描述

服務器啓動之後,把Android推流和播放端的ip改成服務器的部署ip,就能夠開始直播了

若是沒有成功,能夠利用srs在線播放器來幫助測試: 1.測試推流能夠在Android上向服務器推流,用srs在線播放,播放成功推流就沒問題了 2.測試播放能夠像上邊同樣,先用ffmpeg推流一個視頻文件,在Android端播放

相關文章
相關標籤/搜索