Android直播實現(一)Android端推流、播放

 版權聲明:本文爲博主原創文章,轉載請註明出處。 https://blog.csdn.net/Mr_Sk/article/details/71083366

最近想實現一個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"/>
  • 1
  • 2
  • 3
  • 4
  • 5
//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);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

關鍵代碼就這麼幾句(狀態回調有很多這裏就不貼了,可以看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" />
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
    /*java代碼*/

    /*onCreate中,用於檢查vitamioLibs庫是否準備完成
     *如果Manifest中沒有初始化InitActivity,這裏會返回false,並自動初始化InitActivity
     */
    if (!LibsChecker.checkVitamioLibs(this))
            return;

    VideoView mVideoView=(VideoView) findViewById(R.id.surface_view);
    /*會有幾秒延時*/
    mVideoView.setVideoPath(rtmpUrl);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

然後就可以開始愉快的播放rtmp流了,是不是簡單到令人髮指

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

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