音视频直播核心技术

主要包含的内容:

  • 音视频编解码
  • 推流 通过RTMP协议,有用到NDK

RTMP协议:基于TCP,主要用来在Flash/AIR平台和支持RTMP协议的流媒体/交互服务器之间进行音视频和数据通信。支持该协议的软件包括Adobe Media Server/Ultrant Media Server/red5(流媒体服务器)等。

针对Android端的RTMP推流的选择方案有两大类

1、利用FFmpeg进行直播推流

2、利用开源的SDK

  • 百度云推流SDK

  • 七牛推流SDK

  • 网易云推流SDK

直播的过程

音视频直播核心技术_第1张图片

这一块的音视频数据就好比是一个嫩模在直播,将数据通过rtmp协议推送到流媒体服务器,流媒体服务器通过分发的方式发送给各个客户端进行观看。当然,音视频数据这一块是有编解码的一个过程,这一块暂时不说,放在下一篇来讲解。

下面我们使用的是**ffmpeg(C库)**框架来实现RTMP推流到流媒体

那么什么是ffmpeg呢?

首先,ffmpeg是专门来处理音视频的库。它的功能有:视频转换,格式转换,视频采集,视频截图,水印等等

其次,ffmeg分为8大模块

音视频直播核心技术_第2张图片

  • libavcodec-56.so 编解码使用
  • libavdevice-56.so 视频采集,调用摄像头使用
  • libavfilter-56.so 加水印,滤镜效果使用,比如美拍
  • libavformat-56.so 封装格式的使用(flv、MP4、rmvb都是封装格式,获取里面的数据就要通过这个去拿)
  • libavutil-54.so 里面是一些工具方法库
  • libpostproc-53.so 后期制作的功能
  • libswresample-1.so 重新采样数据格式转换,比如把16位的pcm数据转换为32位的pcm数据
  • libswscale-3.so 画面进行缩放,比如解码之后得到yuv或者rgb

代码实现
先把MP4的文件读取出来,然后推流至流媒体服务器

音视频直播核心技术_第3张图片

第一步:编写布局




    

        

        
    

    
        

        
    

    

PushStringActivity.java

 package com.zy.performance_optimization.pushstring;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;

import com.zy.performance_optimization.R;

 public class PushStringActivity extends AppCompatActivity {

     private EditText et_input;
     private EditText et_output;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_push_string);

        et_input=findViewById(R.id.et_input);
        et_output=findViewById(R.id.et_input);
        

    }


     /**
      * 开始推流
      * @param view
      */
    public void mStart(View view){
          String input = et_input.getText().toString();
          String output = et_output.getText().toString();

        // TODO: 2018/9/12   通过ffmpeg来实现 
    }
}

然后新建一个FFmpegUtils.java,里面写个native方法,前面说过FFmpeg一般都是C来实现的

package com.zy.performance_optimization.pushstring;

public class FFmPegUtils {

    /**
     * 把本地的音视频数据通过rtmp协议发送到流媒体服务器上
     * @param input 视频文件地址
     * @param output 流媒体的地址
     */
    public native static void push(String input,String output);
}

在main目录下创建jni文件,打开Tererminal
音视频直播核心技术_第4张图片

然后cd到java的这个目录

音视频直播核心技术_第5张图片

这样就在java目录下生成了一个…h的头文件

音视频直播核心技术_第6张图片

然后把这个文件放在jni目录下,然后打开文件,发现上面的#include文件都进不去,这时候需要配置一下

相关链接:
AndroidStudio 进行 JNI / NDK 开发:初步配置及使用
最简单的基于FFmpeg的移动端例子:Android HelloWorld
在androidstudio2.2上使用ffmpeg动态库
使用Android Studio开发FFmpeg的正确姿势

你可能感兴趣的:(Android)