ffmpeg推送直播流的技术进展
首先安装好NGINX并打开服务 然后安装好ffmpeg 然后参考:http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=28790518&id=5756446 下载并编译m3u8-segment,什么是m3u8:https://www.zhihu.com/question/21087379、https://zh.wikipedia.org/zh-hans/M3U 在输入 ./configure 之后遇到了和作者一样的问题: configure: error: Package requirements (libavformat libavcodec libavutil) were not met: No package 'libavformat' found
No package 'libavcodec' found
No package 'libavutil' found 我们需要输入下面的命令: sudo apt-get install libavformat-dev
然后再输入 nake -j16,然后是sudo make install 输入ls -lh查看当前目录的所有文件的详细信息,发现已经生成了 m3u9-segmenter并且其是可执行文件 如何使用,建议直接参考:https://github.com/m3u8-segmenter/m3u8-segmenter 比上面的chinaunix说的好 m3u8-segmenter已经过期了,作者也放弃了维护 新方法: 先将MP4转为TS格式,然后切片成m3u8再推出去 https://my.oschina.net/ososchina/blog/828100 如果遇到了:Failed to open bitstream filter h264_mp4toannexb for stream with codec copy: Invalid argument 则把命令中的-bsf h264_mp4toannexb参数删除,就可以正常的转换成TS格式了,但是只能输出声音流,视频流缺失了 又兜兜转转,找到了一个好方法:https://github.com/videojs/videojs-contrib-hls/issues/1261 其中使用命令: ffmpeg -i input.mp4 -bsf:v h264_mp4toannexb -codec copy -hls_list_size output.m3u8
可以直接把mp4完成切片TS并生成m3u8播放列表,一行搞定 然后发现HLS这种已经过时了,延时太高了(https://www.jianshu.com/p/5b1341e97757?utm_campaign=maleskine&utm_content=note&utm_medium=pc_all_hots&utm_source=recommendation) 最新的方法是HTTP+FLV 在播放端方面,QT内置的QMedia非常的智障,https://stackoverflow.com/questions/30507317/how-do-i-play-a-stream-with-qmediaplayer 打算换成Qt-vlc https://vlc-qt.tano.si/ 以后一定多用英文进行搜索……老外研究问题喜欢总结,而且总结的比较规范,前因后果各种环境和配置说的很明白 今天也算是在一天之内经历了三代的推流技术……明天还要把QT-VLC添加到QT工程中,重构很多代码 听说大公司都有架构师进行整体架构,还有人专门去调查和选择使用什么框架技术,而我这里相当于全栈工程师……从服务器推送视频流到前端的界面显示全包了…… 真是心累啊
重构前的”流水账“原文
对原文进行重构后:
如果你打算开发一个直播APP(从推送端到播放端),可以看一下本文
创建日期:2018年4月12日
有两篇文章和本文很像,可以先看一下专业人士写的文章,可能更有帮助:
- https://www.yanxurui.cc/posts/server/2017-11-25-http-flv/
- https://cloud.tencent.com/developer/article/1009863
先放一张图:(参考:简书:做一款仿映客的直播App?看我就够了)
第一种方式:RTMP
如果你打算使用ffmpeg来开发一个直播流推送平台(如斗鱼平台),我们先以“ffmpeg+推流”来进行搜索,得到的最多的结果(在2018年4月12日是这样)是使用ffmpeg+rtmp来构建直播流推送平台。
这种方式非常简单,按照教程先安装NGINX,再安装FFMPEG并进行某些设置即可。最终使用的推送命令可能是这样的:
/home/yourname/ffmpeg/ffmpeg -re -stream_loop - -i /media/test_car.mp4 -vcodec copy -acodec aac -ar -strict - -ac -f flv -s 1920x1080 -q rtmp://yourip/myapp/test0
上面是推流端,而在接收端,则需要在某个播放器(VLC或者PotPlayer)中打开如下链接:
rtmp://yourip/myapp/test0
这种使用RTMP进行构建的方式,也是目前主流直播平台会采用的一种方式,其延时只有1~3秒,
但唯一的问题是在播放端加载的链接是RTMP开头的,这种协议需要专门的库去进行支持,
对于开发播放器十分不友好,比如QT中的QMedia就无法解析这种链接,只能解析HTTP开头的链接
其实也有可以解析RTMP链接的方式,需要进一步开发,请参考:https://blog.csdn.net/fanhenghui/article/details/77864372
第二种方式:HLS
“HLS是一个由苹果公司提出的基于HTTP的流媒体网络传输协议”(参考:https://zh.wikipedia.org/zh-hans/HTTP_Live_Streaming)
如果你打算开发iOS直播应用,很可能会被强制使用这种播放格式
但是这种播放方式最大的问题是延时高,所以对直播平台的高实时性并不十分适用
第三种方式:HTTP-FLV
这种方式同样是基于RTMP,但是使用了HTTP协议进行发送,所以在播放端会对一个HTTP链接进行解析(大部分播放器都可以,QT原生的也可以)
比如CCTV3的直播地址:
http://ivi.bupt.edu.cn/hls/cctv3hd.m3u8
有一位博主已经实现了这种方式并且据说被4个厂家应用了:
详见:基于nginx-rtmp-module模块实现的HTTP-FLV直播模块(nginx-http-flv-module)
但是没有放出源代码,只给了部分代码
根据https://www.yanxurui.cc/posts/server/2017-11-25-http-flv/的说法,目前这种HTTP-FLV的方式都是大家各自自己写的,而原来的nginx+rtmp并不能实现HTTP+FLV。
这里有一个对HTTP+FLV的实现——flv.js:https://cloud.tencent.com/developer/article/1009863
可以作为一定的参考
下面是自己的理解:
这种方式需要首先将本地视频文件(如一个MP4文件)转为TS格式,
然后将TS视频文件切分成多个小文件(同样是TS格式结尾),并同时生成一个m3u8格式的播放列表文件
在推送时只需要将播放列表文件推送出去,播放端即可根据这个列表文件找到相应的视频文件
有一个一行就可以搞定上面三行话的命令行:
ffmpeg -re -i /media/.mp4 -bsf:v h264_mp4toannexb -vcodec copy -acodec aac -hls_list_size -hls_wrap /output/output.m3u8 -f flv rtmp://yourip/hls/artest1
根据某个博客的说法,在推流时要写:
rtmp://yourip/hls/artest1
但是在播放端进行解析的时候可以用
http://yourip:yourport/hls/artest1.m3u8
所以就存在了一个问题,如何让推流时的链接,能够找到相应的m3u8被保存在了哪里呢?
推流链接中的
/output/output.m3u8
只是表示将TS进行切分后保存在这个output目录下,并将对应的m3u8播放列表也保存到这个目录下,
并没有一个机制告诉播放端,如何解析那个HTTP链接去找到m3u8和相应的TS文件在哪里
然后再去调查,有人说将NGINX中对HTTP协议的文件加载路径进行修改,可是修改后仍然是不行……目前卡在了这里
我在想是不是做好了m3u8和相应TS文件的映射,就可以用原有的RTMP+NGINX的方式推流出HTTP+FLV格式的直播流呢?
========= 未完待续 ===============
一些给读者的提示:
1. m3u8-segmenter已经过时,作者自己也放弃了维护。ffmpeg已经将分割这个功能集成了,不需要再去加载额外的库
详见:https://github.com/m3u8-segmenter/m3u8-segmenter
2. 可以参考学习的链接:
推流:
[1] 直播协议 HTTP-FLV 详解: http://akagi201.org/post/http-flv-explained/
[2] Mac搭建nginx+rtmp服务器: https://www.jianshu.com/p/02222073b3f1
QT与播放
[1] How do i play a stream with QMediaPlayer:https://stackoverflow.com/questions/30507317/how-do-i-play-a-stream-with-qmediaplayer
[2] https://github.com/vlc-qt/vlc-qt
ffmpeg推送直播流的技术进展的更多相关文章
- 基于OpenCV 的美颜相机推送直播流
程序流程: 1.图像采集 先从opencv(2.4.10版本)采集回来摄像头的图像,是一帧一帧的 每一帧图像是一个矩阵,opencv中的mat 数据结构. 2.人脸的美化 人脸美化,我们用的皮肤检测, ...
- ffmpeg推送RTSP直播流到EasyDarwin报错问题的修复
在之前的博客<ffmpeg推送,EasyDarwin转发,vlc播放 实现整个RTSP直播>中,我们介绍了如何采用ffmpeg进行RTSP推送,实现EasyDarwin直播分发的功能,近期 ...
- ffmpeg推送,EasyDarwin转发,vlc播放 实现整个RTSP直播
部署EasyDarwin流媒体服务器 ffmpeg推送摄像机视频到EasyDarwin VLC播放 第一步:部署EasyDarwin流媒体服务器 EasyDarwin的部署过程我们就不再赘述了,在Ea ...
- ffmpeg 推送、保存rtmp 流命令
1.将文件当做直播送至live ffmpeg -re -i localFile.mp4 -c copy -f flv rtmp://server/live/streamName 2.将直播媒体保存至本 ...
- EasyRTMP手机直播推送rtmp流flash无法正常播放问题
本文转自EasyDarwin团队Kim的博客:http://blog.csdn.net/jinlong0603/article/details/52960750 问题简介 EasyRTMP是EasyD ...
- 将EasyRTMP_RTSP移植到Android平台实现的RTSP拉流转推RTMP直播流功能
本文转自EasyDarwin开源团队成员Kim的博客:http://blog.csdn.net/jinlong0603/article/details/73253044 前言 安防互联网化的需求已经越 ...
- windows ffmpeg 推送摄像头数据到rtmp服务
文本主要讲述windows系统下如何利用ffmpeg获取摄像机流并推送到rtmp服务,命令的用法前文 中有讲到过,这次是通过代码来实现.实现该项功能的基本流程如下: 图1 ffmpeg推流流程图 较前 ...
- EasyDarwin开源流媒体服务器如何实现按需推送直播的
--本文转自EasyDarwin开源团队成员邵帅的博客:http://blog.csdn.net/ss00_2012/article/details/51441753 我们使用EasyDarwin的推 ...
- 极光推送CTO黄鑫:技术人员要建立自己的知识图谱
本周,我们邀请到了极光推送CTO兼首席科学家黄鑫进行人物专访,在展示风采的同时,也分享会员们对技术.对工作.对人生的感悟. 扎实的底层服务是扩张关键 极光推送是一个做第三方云服务的公司,在 ...
随机推荐
- JS数组映射保存数据-场景
开发遇到,写个随笔,以防我的金鱼记忆 场景:一个页面从后台拿到20条数据,把他们展现在页面上,当点击某一个item时,需要展示这个item的详情,通常不会去把页面调走,就在本页面通过 display: ...
- test--1
void(document.body.innerHTML.replace(/"return DeletePost\((\d+),([^"]+)\)"/g, functio ...
- 实现我的第一个Java程序
第一步.打开记事本 第二步.代码编写 public class Hello{ public static void main( String[] args){ System.out.println(& ...
- 常见IO模型
在socket的通信中,recv,accept,recvfrom(UDP协议接收信息)这些阶段由于需要收到信息,才能继续下面的代码,所以这些阶段叫做阻塞,类似于我们python变成中的input函数, ...
- erlang二进制
在Erlang中写处理二进制数据的代码是洋溢着幸福感的,它对于二进制强大的表现力甚至能让你忘掉了它种种不便,今天我们说说Erlang的二进制数据处理. Erlang中bit string代表无类型的内 ...
- dubbo-admin 配置运行
1.下载dubbo源码:http://dubbo.io/ 2.idea 导入maven项目 3.配置tomcat:http://localhost:8080/ 4.下载zookeeper:http:/ ...
- js中三种弹出框
javascript的三种对话框是通过调用window对象的三个方法alert(),confirm()和prompt()来获得,可以利用这些对话框来完成js的输入和输出,实现与用户能进行交互的js代码 ...
- 团队项目需求心得——慢阻肺疾病管理APP
一.项目介绍: 先上图: 这是我们小组开发项目的系统构成图. 本项目研发面向家庭/社区,对稳定期中慢阻肺患者病情和环境全方位监测.简单病情趋势分析和患者行为干预,并且提供患者与家庭医生和专家沟通渠道的 ...
- Java——总结
一.编写并运行java程序步骤: 1.编写java源代码 java源代码文件都已java作为扩展名 java代码格式: class 类名{ //主方法} 2.编译,将字符文件编译为字节文件 在dos中 ...
- C++中的字符串的输入输出函数、空字符与空格的区别、字符变量赋值和字符串初始化
一.字符串输入输出函数 1. cin.get() 逐个字符输入输出 2. cin 可以将整个字符串一次性输入,但是,cin将空格.Tab和回车键,因此不能用于数组的一次性输入. 注意:ci ...