ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

AndroidMP4视频文件推送rtmp

2021-10-23 23:33:09  阅读:194  来源: 互联网

标签:AndroidMP4 ffmpeg void rtmp 视频文件 import publishDisposable public RTMP


AndroidMP4视频文件推送rtmp,直播

RTMP介绍

RTMP是Real Time Messaging Protocol(实时消息传输协议)的首字母缩写。该协议基于TCP,是一个协议族,包括RTMP基本协议及RTMPT/RTMPS/RTMPE等多种变种。RTMP是一种设计用来进行实时数据通信的网络协议,主要用来在Flash/AIR平台和支持RTMP协议的流媒体/交互服务器之间进行音视频和数据通信。支持该协议的软件包括Adobe Media Server/Ultrant Media Server/red5等。RTMP与HTTP一样,都属于TCP/IP四层模型的应用层。RTMP和RTSP协议已经成为直播的主流协议,对于安防监控等场景应用广泛。

传送协议

RTMP(Real Time Messaging Protocol)实时消息传送协议是Adobe Systems公司为Flash播放器和服务器之间音频、视频和数据传输 开发的开放协议。
它有多种变种:
1)RTMP工作在TCP之上,默认使用端口1935;
2)RTMPE在RTMP的基础上增加了加密功能;
3)RTMPT封装在HTTP请求之上,可穿透防火墙;
4)RTMPS类似RTMPT,增加了TLS/SSL的安全功能;

功能实现

分为几个步骤:
1.将本地保存的MP4视频文件,读取进行编码H264.H264格式字节。
2.将编码后的字节帧数组组装
3.通过ffmpeg 进行转化
4.链接RTMP远程地址
5.连接成功后将帧数据ffmpeg写入到RTMP连接中
6.用户就能通过RTMP地址查看视频了

相关代码

package com.onzhou.ffmpeg.streamer;

/**
 * @anchor: andy
 * @date: 2018-10-29
 * @description:
 */
public class NativeStreamer {

    static {
        System.loadLibrary("native-stream");
    }

    public native int startPublish(String mp4Path, String stream);

    public native void stopPublish();

}
package com.onzhou.ffmpeg.main;

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.os.AsyncTaskCompat;
import android.view.View;
import android.widget.TextView;

import com.onzhou.ffmpeg.base.AbsBaseActivity;
import com.onzhou.ffmpeg.streamer.NativeStreamer;
import com.onzhou.ffmpeg.streamer.R;
import com.onzhou.ffmpeg.task.AssertReleaseTask;

import java.io.File;

import io.reactivex.disposables.Disposable;
import io.reactivex.schedulers.Schedulers;

/**
 * @anchor: andy
 * @date: 2018-10-29
 * @description:
 */
public class NativeStreamActivity extends AbsBaseActivity implements AssertReleaseTask.ReleaseCallback {

    /**
     * 推流地址
     */
    
    private static final String PUBLISH_ADDRESS = "rtmp://192.168.1.102:1935/onzhou/live";

    /**
     * 开始推流按钮
     */
    private TextView mBtnStartPublish, mBtnStopPublish;

    private NativeStreamer nowStreamer;

    private Disposable publishDisposable;

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

    @Override
    protected void onPostCreate(@Nullable Bundle savedInstanceState) {
        super.onPostCreate(savedInstanceState);
        setupViews();
        setupVideo();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (publishDisposable != null && !publishDisposable.isDisposed()) {
            publishDisposable.dispose();
            publishDisposable = null;
        }
    }

    private void setupViews() {
        mBtnStartPublish = (TextView) findViewById(R.id.btn_start_publish);
        mBtnStopPublish = (TextView) findViewById(R.id.btn_stop_publish);
    }

    public void setupVideo() {
        AssertReleaseTask videoReleaseTask = new AssertReleaseTask(this, "input.mp4", this);
        AsyncTaskCompat.executeParallel(videoReleaseTask);
    }

    @Override
    public void onReleaseSuccess(String videoPath) {
        mBtnStartPublish.setEnabled(true);
    }

    public void onStartClick(View view) {
        mBtnStartPublish.setEnabled(false);
        mBtnStopPublish.setEnabled(true);
        if (nowStreamer == null) {
            nowStreamer = new NativeStreamer();
        }
        if (publishDisposable == null) {
            publishDisposable = Schedulers.newThread().scheduleDirect(new Runnable() {
                @Override
                public void run() {
                    final File inputVideo = new File(getExternalFilesDir(null), "input.mp4");
                    nowStreamer.startPublish(inputVideo.getAbsolutePath(), PUBLISH_ADDRESS);
                }
            });
        }
    }

    public void onStopClick(View view) {
        if (nowStreamer != null) {
            nowStreamer.stopPublish();
        }
        if (publishDisposable != null) {
            publishDisposable.dispose();
            publishDisposable = null;
        }
        mBtnStartPublish.setEnabled(true);
        mBtnStopPublish.setEnabled(false);
    }
}

github地址:android_rtmp视频文件播放
图片描述
标红的工程

配置

备注:根据自己的CPU架构需要可以配置多款生成动态依赖库,本人使用arm64-v8a
根据自己的CPU架构需要可以配置多款生成动态依赖库,本人使用arm64-v8a

标签:AndroidMP4,ffmpeg,void,rtmp,视频文件,import,publishDisposable,public,RTMP
来源: https://blog.csdn.net/weixin_41602901/article/details/120927794

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有