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

主要包含的内容:

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

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

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

1、利用FFmpeg进行直播推流

2、利用开源的SDK

直播的过程

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

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

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

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

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

其次,ffmeg分为8大模块

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


代码实现
先把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来实现 
    }
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37

然后新建一个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的这个目录

直播软件搭建的音视频直播核心技术_直播源码_05

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

直播软件搭建的音视频直播核心技术_直播源码_06

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

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

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