美文网首页
php+ffmpeg+nginx实现 rtsp数据流转为rtmp

php+ffmpeg+nginx实现 rtsp数据流转为rtmp

作者: 米阔酱 | 来源:发表于2020-01-16 18:31 被阅读0次

    公司需要在网页端显示rtsp视频数据,而网页端的vlc插件支持不算好等等原因,打算自己用php后台写一个服务器,将rtsp数据流转成rtmp后再在pc端显示。

    因为之前从来没有接触过rtsp,也完全不知道ffmpeg是个什么东西,所以,在搭建服务器的过程中踩了很多的坑。

    现在将这些坑记录下来,因为后续往测试和正式服务器上面部署的时候还有再次操作,免得之后忘记了。

    废话不多说了,直接开始。

    一、安装ffmpeg

    因为我是在我本地开发的,我本地是window环境

    ffmpeg下载链接:https://ffmpeg.zeranoe.com/builds/win64/static/

    点进去之后,选择了latest最新的版本。

    下载到本地之后解压缩,将解压缩后的文件夹放在自己心仪的位置。

    然后

    点到bin目录下,将此目录添加的path的环境变量里面。

    之后点开cmd

    输入ffmpeg

    显示成这样就表示ffmpeg安装成功了。

    就这样,ffmpeg先告一段落,接着搭建nginx服务器。

    在这里的时候,我遇到了一个问题,我本地搭建的服务器是用的xampp这样的集成,已经是开了apache了。如果再安装一个nginx那势必会与我的apache冲突。虽然可以重新配置,但是想想还要重新搭一套nginx的服务器也挺烦的。

    于是我想到,我们公司的测试环境刚好就是用nginx搭的么,我把这个转换rtsp的服务搭到测试环境上不就好了么?

    说干就干,我ssh上了公司的测试服务器,然后按照网上的教程就开始配置nginx的config文件了,然后,重启nginx就报错了。

    搜了百度后,才发现,我的nginx没有装nginx-rtmp-module 这个模块。

    apt-get update

    apt-get install libnginx-mod-rtmp

    这两个命令就安装好了,重启nginx。

    另外nginx.conf里面关于rtmp的配置是这样的

    rtmp{

         server{

              listen 1935;

             chunk_size 4096; 

              application live{

                 live on;

                  record off;

                  max_connections 1024;

              }

         }

    }

    开始的时候我将这个配到了conf.d里面去了,然后一直报错。放到nginx.conf里面就好了,时间紧迫,我也没有去研究为什么。

    一直到这里,转流服务器好像就搭好了,于是,我开始兴冲冲地尝试。

    回到本地,打开cmd

    在里面输入

    ffmpeg -i rtsp://onvif:Admin-12345@10.200.200.240:554/Streaming/channels/7601 -c:a copy -c:v libx264 -f flv rtmp://ip:1935/live

    这样的一个命令。

    rtsp://onvif:Admin-12345@10.200.200.240:554/Streaming/channels/7601 这个是rtsp链接。

    rtmp://ip:1935/live 这个是自己搭建的转流服务器链接。(将ip替换成自己的即可)。

    结果,命令行执行了这个命令后,并没有成功,眼瞅着快要成功了,却给我报了一个

    method SETUP failed: 454 Session Not Found 这个样子的错位。

    简直要愁白头了,又开始海量百度,但是,网上这样的问题,真的不多啊,好多我还看不懂,这可怎么是好啊。

    这时候,有个做过手机端rtsp转流的同事跟我说,是不是我用的rtsp流有问题。让我换一个rtsp链接试试。

    于是,没有头绪的我,乖乖地换了一个链接。

    结果,真的成功了。

    但是,为什么刚刚那个链接不行呢?同事说,那个rtsp的编码有问题。

    于是,我利用vlc看了一下那个rtsp的编码,发现是h265的,网上一搜,果然,nginx一般而言不支持。

    因为时间问题,我没有去解决这个问题,不过网上有类似的教程,先贴上链接,等我下次再弄。

    https://blog.csdn.net/ybn187/article/details/88351874

    https://zhuanlan.zhihu.com/p/94440269。

    到这里,后端做的事情基本上就完成了,可是,我还需要将这个视频放到pc端啊。

    于是,我又跑去弄前端了。

    公司前端用的是vue,根据网上的推荐,我打算用video.js来实现rtmp视频流的播放。

    首先

    npm install video.js

    npm install videojs-flash (ps:这个千万不要忘记了,否则rtmp展示前端会有问题。)

    别的不说了,直接贴代码,当然也是根据网上的参考来的。

    main.js里面注册

    import Video from 'video.js'//浏览器视频插件

    import 'video.js/dist/video-js.css'

    Vue.prototype.$video = Video

    接着到展示页面:

    这个千万不要忘记引用 斜杠一定要加上

    <video id="myVideo" class="video-js">

          <!-- <source src="../../../static/7efaf904a76f6050251da6d38980600c.mp4" type="video/mp4" > -->

          <source src="rtmp://ip:1935/live/" type="rtmp/flv" >

        </video>

    mounted() {

            this.initVideo();

        },

      methods:{

        initVideo() {

                //初始化视频方法

                let myPlayer = this.$video(myVideo, {

                    //确定播放器是否具有用户可以与之交互的控件。没有控件,启动视频播放的唯一方法是使用autoplay属性或通过Player API。

                    controls: true,

                    //自动播放属性,muted:静音播放

                    autoplay: "muted",

                    //建议浏览器是否应在<video>加载元素后立即开始下载视频数据。

                    preload: "auto",

                    //设置视频播放器的显示宽度(以像素为单位)

                    width: "800px",

                    //设置视频播放器的显示高度(以像素为单位)

                    height: "400px"

                });

                }

      }

    之后允许chrome使用flash插件即可。

    相关文章

      网友评论

          本文标题:php+ffmpeg+nginx实现 rtsp数据流转为rtmp

          本文链接:https://www.haomeiwen.com/subject/uhiowxtx.html