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

來源:互聯網
上載者:User

標籤:review   大神   開發人員   article   媒體伺服器   0kb   trunk   準備   test   

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

: 

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

一: 
使用javacv來實現,最終也是用過ffmpeg來進行編碼和推流,javacv實現到可以直接接收網路攝影機的幀資料 
需要自己實現的代碼只是開啟網路攝影機,寫一個SurfaceView進行預覽,然後實現PreviewCallback將網路攝影機每一幀的資料交給javacv即可 
javacv地址:https://github.com/bytedeco/javacv 
demo地址:https://github.com/beautifulSoup/RtmpRecoder/tree/master

二: 
使用Android內建的編碼工具,可實現寫入程式碼,這裡有一個國內大神開源的封裝很完善的的庫yasea,第一種方法需要實現的Camera採集部分也一起封裝好了,進行一些簡單配置就可以實現編碼推流,並且yasea目前已經直接支援網路攝影機的熱切換,和各種濾鏡效果 
yasea地址(內建demo):https://github.com/begeekmyfriend/yasea

伺服器

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

播放器

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/srscd 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地址換成自己部署的ipsudo ./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端播放

 

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.