直播软件搭建的音视频直播核心技术

主要包含的内容:

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

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

直播软件搭建针对Android端的RTMP推流的选择方案有两大类

1、利用FFmpeg进行直播推流

2、利用开源的SDK

  • 百度云推流SDK

  • 七牛推流SDK

  • 网易云推流SDK

直播的过程

直播软件搭建的音视频直播核心技术_数据

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

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

那么直播软件搭建中什么是ffmpeg呢?

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

其次,ffmeg分为8大模块

直播软件搭建的音视频直播核心技术_数据_02

  • 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的文件读取出来,然后推流至流媒体服务器

直播软件搭建的音视频直播核心技术_音视频_03

第一步:编写布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.zy.performance_optimization.pushstring.PushStringActivity">

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">

<TextView
android:text="输入路径"
android:id="@+id/text_label1"
android:layout_weight="0"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />

<EditText
android:id="@+id/et_input"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:ems="10"
android:inputType="textUri"
android:text="singtel.mp4"
android:textColor="#ff8c00"/>
</LinearLayout>

<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:text="输出路径"
android:id="@+id/text_label2"
android:layout_weight="0"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />

<EditText
android:id="@+id/et_output"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:ems="20"
android:inputType="textUri"
android:text="rtmp://www.velab.com.cn/live/test"
android:textColor="#ff8c00"/>
</LinearLayout>

<Button
android:id="@+id/button_start"
style="?android:attr/buttonStyleSmall"
android:onClick="mStart"
android:text="开始"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:ignore="OnClick" />
</LinearLayout>

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

直播软件搭建的音视频直播核心技术_数据_04

然后cd到java的这个目录

直播软件搭建的音视频直播核心技术_android_05

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

直播软件搭建的音视频直播核心技术_android_06

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

直播软件搭建的音视频直播核心技术

本文转载自网络,感谢(zhangyDD)的分享,转载仅为分享干货知识,如有侵权欢迎联系云豹科技进行删除处理