@TOC

1.FFmpeg1的安装、解压并放置在盘符的根目录下

ffmpeg实现rtsp转rtmp_http-flv_java FFmpeg Nginx

2、配置环境变量(1)找到bin目录的文件夹

ffmpeg实现rtsp转rtmp_http-flv_java FFmpeg Nginx_02

复制地址:D:\ffmpeg\ffmpeg\bin

(2)配置环境变量

ffmpeg实现rtsp转rtmp_http-flv_java FFmpeg Nginx_03

ffmpeg实现rtsp转rtmp_http-flv_java FFmpeg Nginx_04

ffmpeg实现rtsp转rtmp_http-flv_java FFmpeg Nginx_05

ffmpeg实现rtsp转rtmp_http-flv_java FFmpeg Nginx_06

ffmpeg实现rtsp转rtmp_http-flv_java FFmpeg Nginx_07

确认配置后

(3)检查安装是否完成

win+输入cmdr:ffmpeg -version出现如下字样

ffmpeg实现rtsp转rtmp_http-flv_java FFmpeg Nginx_08

二、安装Nginx1、解压压缩包并放置在盘子下

ffmpeg实现rtsp转rtmp_http-flv_java FFmpeg Nginx_09

2、修改nginx.conf文件

ffmpeg实现rtsp转rtmp_http-flv_java FFmpeg Nginx_10

注:rtmp监控端口:rtmp流输出地址端口;http监控端口:http-flv流输出地址端口;http配置打开:flv_live on;

3、启动Nginx

ffmpeg实现rtsp转rtmp_http-flv_java FFmpeg Nginx_11

双击启动,检查过程中是否存在,如果存在,启动成功

三、测试1、CMD直播流测试(如果当地环境没有直播流,直接看4,回放流)(1)低画质,低延迟
ffmpeg -i “rtsp流地址” -vcodec copy -acodec copy -f flv  "rtmp://127.0.0.1:1935/live/100"
a.输出rtmp地址:
rtmp://127.0.0.1:1935/live/100
b.http_flv地址输出
http://127.0.0.1:8086/live?port=1935&app=live&stream=100
(2)高画质、高延迟
ffmpeg -re  -rtsp_transport tcp -i “rtsp流地址” -f flv -vcodec libx264 -vprofile baseline -acodec aac -ar 44100 -strict -2 -ac 1 -f flv -s 1280x720 -q  10 "rtmp://127.0.0.1:1935/live/test(输出rtmp地址)
a.输出rtmp地址:
rtmp://127.0.0.1:1935/live/test
b.http_flv地址输出
http://127.0.0.1:8086/live?port=1935&app=live&stream=test
2、回放流rtsp可用地址测试(1)
rtsp:///wowzaec2demo.streamlock.net/vod/mp4:BigBuckBunny_115k.mov
(2)cmd测试
ffmpeg -re -rtsp_transport tcp -i “rtsp流地址” -f flv -r 25 -s 1280x720 -an "rtmp://127.0.0.1:1935/live/100"
a.输出rtmp地址:
rtmp://127.0.0.1:1935/live/100
b.http_flv地址输出
http://127.0.0.1:8086/live?port=1935&app=live&stream=100
3、或网页测试播放rtmp流或http流

ffmpeg实现rtsp转rtmp_http-flv_java FFmpeg Nginx_12

四、前端流媒体处理与分析1、代码atmp处理方法.引入插件
<script src="$!{main_static_ckplayer_url}/ckplayer.js" charset="UTF-8"></script>
b.代码实现

构造容器

<p id=’pId’ class='video-js'></p>

配置插件的属性

var videoObject = {container: `#${pId}`(`.${video-js}`), ///ID或clasnamevariable容器: 'player//播放函数名称autoplay:true,//自动播放definition:false,loop:true,//循环播放videoeo:src//通过接口获得的rtmp流};

执行播放函数

let player = new ckplayer(videoObject);

销毁视频的方法

let  player = new ckplayer(treeNodeId);///使用容器id获取视频对象playerer.videoClear() ////销毁视频控制

rtmp是tcp协议,需要flash支持,不支持flash插件的浏览器上不能使用插件播放视频

2、http-flv处理方法及代码a.引入插件
<script src="$!{main_static_base_url}/plug/video/flv/flv.js"></script>
b.代码实现

H5标签可以直接用作容器,因为它支持HTTP协议

<video controls="controls" muted id='flvPlayer'></video>let videoElement = document.getElementById('flvPlayer');根据容器id获得元素

配置插件的属性

let flvPlayer = flvjs.createPlayer({type: 'flv',isLive: true,///是否直播hasaudioio: false,///是否有音频hasvideo: true,//是否有视频enablestashbufer?: true,//是否使用IO隐藏缓冲区urll: srchttpflv格式流}/接口获取);

执行播放函数

flvPlayer.attachMediaElement(videoElement);flvPlayer.load();flvPlayer.play();

process字段通过接口销毁视频,关闭容器时使用接口销毁视频

c.补充说明

httpflv是http协议,不需要flash插件的支持,原理是将音视频数据包装成FLV格式,然后通过 HTTP 通过flv将协议传输给客户端.js可以脱离flash插件,在H5上播放http-flv流

3、异同分析a.相同点

1.需要使用插件2.拖动进度条不方便3.需要相应的id匹配容器

b.差异

1.http-flv是http协议,通过flv.js使其脱离flashplayer插件,使用h5播放视频流,rtmp需要在flashplayer的支持下播放2.http-flv不支持多音频流、多视频流,有时由于音频的原因,流不能播放,rtmp不会3.flv.js可以使用h5标签作为容器播放视频流,rtmp可以使用

标签不能作为容器使用

五、后端处理部分1、文件配置

ffmpeg实现rtsp转rtmp_http-flv_java FFmpeg Nginx_13

2、代码块
/** * <ul> * <li>文件名称:RtspToRtmpUtils</li> * <li>文件描述:</li> * <li>版权所有: 版权所有(C) 2020</li> * <li>内容摘要:</li> * <li>其他说明:</li> * <li>创建日期: 2021-05-17</li> * <li>@author: 技术中心</li> * <li>版本号: 1.0.0</li> * </ul> **/public class RtspToRtmpUtils {    public static FFmpegManager manager = new FFmpegManagerImpl();    /**    * @功能描述: FFmpeg转流    * @param: [rtsp]    * @return: com.alibaba.fastjson.JSONObject    * @author: 技术中心    * @date: 2021/12/06 16:00    **/    public JSONObject getRtmp(String rtsp) throws InterruptedException {        JSONObject jsonObject=new JSONObject();        /**随机数*//**        int max=1000,min=1;        /**ip*/        String ip="192.168.106.13";        int num = (int) (Math.random()*(max-min)+min);        /**转流开始*//**转流        String start = manager.start("process" + num, "ffmpeg -i " + rtsp + " -vcodec copy -acodec copy -f flv \"rtmp://"+ip+":1935/live/" + num + "\"");        /**输出rtmp流*/        jsonObject.put("url","rtmp://"+ip+":1935/live/"+num);        /**输出http-flv流*/        jsonObject.put("httpurl","http://"+ip+":8086/live?port=1935&app=live&stream="+num);        */**用于关闭流*/        jsonObject.put("process",start);        return jsonObject;    }    /**    * @功能描述: 停止转移过程    * @param: [process]    * @return: boolean    * @author: 技术中心    * @date: 2021/12/06 16:02    **/    public boolean stopProcess(String process){        boolean stop = manager.stop(process);        return stop;    }    /**    * @功能描述: 关闭页面时,停止所有视频    * @param: []    * @return: int    * @author: 技术中心    * @date: 2021/12/08 14:07    **/    public int stopAllProcess(){        int i = manager.stopAll();        return i;    }  }

ps 图灵课堂老师从近一百套最新一线互联网公司面试题中精选而出,涵盖Java架构面试 所有技术栈,包括JVM,Mysql,并发,Spring,Redis,MQ,Zookeeper,Netty, Dubbo,Spring Boot,Spring Cloud,数据结构与算法,设计模式等相关技术领域的大 厂面试题及详解。 详情咨询客服获取全套面经试题。