首先安装好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 0 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 0 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-vlchttps://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 -1 -i /media/test_car.mp4 -vcodec copy -acodec aac -ar 44100 -strict -2 -ac 1 -f flv -s 1920x1080 -q 10 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/1.mp4 -bsf:v h264_mp4toannexb -vcodec copy -acodec aac -hls_list_size 1 -hls_wrap 10 /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

转载于:https://www.cnblogs.com/QingHuan/p/8795202.html

ffmpeg推送直播流的技术进展相关推荐

  1. ffmpeg推送rtsp流或者视频文件到rtsp服务器

    1.推送rtsp视频流 ffmpeg -i rtsp://admin:admin1234@192.168.1.64:554/h264/ch1/sub/av_stream -codec copy -f ...

  2. 基于OpenCV 的美颜相机推送直播流

    程序流程: 1.图像采集 先从opencv(2.4.10版本)采集回来摄像头的图像,是一帧一帧的 每一帧图像是一个矩阵,opencv中的mat 数据结构. 2.人脸的美化 人脸美化,我们用的皮肤检测, ...

  3. FFmpeg 推送摄像头 rtsp 流

    FFmpeg 推送摄像头 rtsp 流 Windows 环境下使用 FFmpeg 推送本地 USB 摄像头为 rtsp 流,并使用 vlc 播放. 本文主要使用环境是 Windows 下的 FFmpe ...

  4. OBS直播工具使用指南/OBS推送直播视频源到服务器的工具

    OBS使用指南 windows系统 下载和安装 OBS是用于推送直播视频源到服务器的工具,下载安装包地址为http://mtnets.bj.bcebos.com/obs.rar,软件下载之后,根据弹出 ...

  5. FFmpeg推送命令

    ffmpeg推流命令 使用命令推送成rtp流 使用rtp发送 ffmpeg -i rtsp://admin:1qaz2wsx@192.168.10.250:554/Streaming/Channels ...

  6. JavaCV-FFmpeg软封装多线程实现录制或推送rtsp流

    文章目录 前言 一.JavaCV和FFmpeg是什么? 二.录制和推流如何实现? 三.遇到的问题 四.如何实现 五.总结 前言 在一个月之前,有使用过FFmpeg录制过rtsp流的视频.但由于使用的是 ...

  7. 百度SEO站长统计后台广告推送引流软件

    简介: 网站统计广告推送引流软件是一款非常专业的网站引流软件,能够帮助用户伪造站长统计的搜索关键词,支持自定义刷词次数.多线程支持自定义线程数,能够自动导出网站,成功的网址统计代码直接保存,方便下次导 ...

  8. 基于SRS服务器实现Android-Web端视频通话(3):Android端向SRS服务器推送WebRTC流

    基于SRS服务器实现Android-Web端视频通话(3):Android端向SRS服务器推送WebRTC流 实现效果 引库 推流流程 代码实现 初始化 createPeerConnectionFac ...

  9. 2023-03-05:ffmpeg推送本地视频至lal流媒体服务器(以RTMP为例),请用go语言编写。

    2023-03-05:ffmpeg推送本地视频至lal流媒体服务器(以RTMP为例),请用go语言编写. 答案2023-03-05: 使用 github.com/moonfdd/ffmpeg-go 库 ...

最新文章

  1. [转] Leaving patterns practices
  2. linux下通过yum安装svn及实现SVN与WEB同步解决方案[阿里云]
  3. Fiddler抓取移动端请求
  4. 健康医疗数据库建设亟需“万象更新”式变革
  5. Python中的for循环,while循环
  6. Python 标准库 —— string
  7. linux telnet 安装
  8. jQuery二维码插件 jquery.qrcode.js
  9. 在服务中mysql启动不了了_mysql在服务项里无法启动
  10. YOLOv3的环境配置
  11. 优酷KUX视频转换MP4工具,纯个人向分享
  12. 黑灰产套现城市消费券大揭秘
  13. 南昌人武学院计算机室,【志愿者日记】南昌大学人武学院:用行动感染身边的人...
  14. 读javascript高级程序设计09-BOM
  15. Kibana7.9.2设置elasticsearch索引过期时间,到期自动删除
  16. 秀!如何搭建一个永久运行的个人服务器?
  17. ef1a启动子_常见真核启动子及原核启动子特点.doc
  18. AliAGC 自动增益控制算法:解决复杂场景下的音量问题
  19. 宽带网速测试皮肤软件,【问题求助】这个网速测量皮肤测量的网速不准哪大神知道原因?...
  20. Boost.Asio基本原理

热门文章

  1. X264_最简单的视频编码实现(YUV420编码H264)
  2. python在类内部使用装饰器_python – 如何在类中使用装饰器
  3. python写一个笔记软件_科学网—python学习笔记(1)——创建应用 - 高雪峰的博文...
  4. 6种java垃圾回收算法_学习java垃圾回收
  5. centos7添加用户并授权root权限
  6. html禁用选择,html – 设置可选的禁用属性
  7. android gettext方法,方法getText()必须从UI线程(Android Studio)调用
  8. c语言小学生加法考试题程序4,c语言编程题与答案4.doc
  9. 页面回填当前日期与时间
  10. [leetcode]208. 实现 Trie (前缀树)