直播软件搭建的音视频直播核心技术
主要包含的内容:
- 音视频编解码
- 推流 通过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大模块
- 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的文件读取出来,然后推流至流媒体服务器
第一步:编写布局
<?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
然后cd到java的这个目录
这样就在java目录下生成了一个…h的头文件
然后把这个文件放在jni目录下,然后打开文件,发现上面的#include文件都进不去,这时候需要配置一下
直播软件搭建的音视频直播核心技术
本文转载自网络,感谢(zhangyDD)的分享,转载仅为分享干货知识,如有侵权欢迎联系云豹科技进行删除处理