ffmpeg實戰教程(十一)手把手教你實現直播功能,不依賴第三方SDK

代官山發表於2018-07-26

ffmpeg實戰教程(十一)手把手教你實現直播功能,不依賴第三方SDK

2017年05月19日 20:24:01

閱讀數:7817

直播,2016最火的技術之一了,更多的關於直播的知識:http://blog.csdn.net/king1425/article/details/72489272 …這篇我們就不依賴任何整合好的SDK,自己搭建伺服器,用ffmpeg+nginx實現手機直播功能

先上圖:

推流的手機

這裡寫圖片描述

拉流的網頁和VL播放器

這裡寫圖片描述

拉流的手機客戶端

這裡寫圖片描述

對於nginx伺服器的搭建之前有寫過:

ffmpeg實戰教程(九)windows下ffmpeg命令+nginx + rtmp實現推流,拉流。

這篇也建議看一下:

關於音視訊直播技術的總結

 

下面開始實現手機直播功能

1.首先你要準備一份編譯好的ffmpeg+x264庫,我們打算軟編碼推流。 
如果你沒有編譯好的ffmpeg+x264庫也沒關係,我最後會提供原始碼,包含了這些。 
這裡寫圖片描述

其中libnative-lib.so是我打包的採集推流的方法,使用方式如下

2.然後我們在建一個包 com.ws.ffmpegandroidcameralive,在這個包下寫一個WSPlayer類。

public  class WSPlayer {
    static {
        System.loadLibrary("avutil-54");
        System.loadLibrary("swresample-1");
        System.loadLibrary("avcodec-56");
        System.loadLibrary("avformat-56");
        System.loadLibrary("swscale-3");
        System.loadLibrary("postproc-53");
        System.loadLibrary("avfilter-5");
        System.loadLibrary("avdevice-56");
        System.loadLibrary("native-lib");
    }

    public static native int initialize(int width,int height,String url);
    public static native int start(byte[] cameraData);
    public static native int stop();
    public static native int close();
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

initialize(int width,int height,String url) 是初始化方法,三個引數分別是視訊的寬,高,以及,推流的地址。

start(byte[] cameraData);開始推流,引數傳入相機的NV21資料。

stop();停止推流。

close();關閉。

3.編寫介面 
這裡寫圖片描述

點選start開始推流

4.實現具體邏輯

activity中

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
...

 WSPlayer.initialize(mCamera.getParameters().getPreviewSize().width,mCamera.getParameters().getPreviewSize().height,"rtmp://192.168.9.135:1935/wstv/home");
 ...
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

在onCreate中初始化WSPlayer 其中rtmp://192.168.9.135:1935/wstv/home是我的伺服器地址

   final Camera.PreviewCallback mPreviewCallbacx=new Camera.PreviewCallback() {
            @Override
            public void onPreviewFrame(byte[] data, Camera arg1) {

                WSPlayer.start(data);
            }
        };
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

WSPlayer.start(data) 在相機的預覽回撥裡面開始新增資料進行推流

    @Override
    protected void onPause(){
        super.onPause();
        WSPlayer.stop();
        WSPlayer.close();
        if(mCamera!=null){
            mCamera.release();
            mCamera=null;
        }
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

在activity的onPause()方法裡面關閉推流

詳情:demo下載:https://github.com/WangShuo1143368701/FFmpegandroidWSLive

相關文章