视频直播技术真的很难吗?手把手带你实现直播技术(二)

2021-01-20 20:37:13 1297 技术小虫有点萌
  • 在上一篇文章我们已经实现了直播的服务,但是有一些细节需要处理

先来聊聊直播常见的三大协议

  • 国内常见的直播协议有几个:RTMP、HLS、HTTP-FLV,下面我们来一一介绍。

RTMP,全称 Real Time Messaging Protocol,即实时消息传送协议。

Adobe 公司为 Flash 播放器和服务器之间音视频数据传输开发的私有协议。工作在 TCP 之上的明文协议,默认使用端口 1935。协议中的基本数据单元成为消息(Message),传输的过程中消息会被拆分为更小的消息块(Chunk)单元。最后将分割后的消息块通过 TCP 协议传输,接收端再反解接收的消息块恢复成流媒体数据。

  • RTMP 主要有以下几个优点:RTMP 是专为流媒体开发的协议,对底层的优化比其它协议更加优秀,同时它 Adobe Flash 支持好,基本上所有的编码器(摄像头之类)都支持 RTMP 输出。现在 PC 市场巨大,PC 主要是 Windows,Windows 的浏览器基本上都支持 Flash。另外RTMP适合长时间播放,曾经有过测试,联系 100 万秒,即 10 天多连续播放没有出现问题。最后 RTMP 的延迟相对较低,一般延时在 1-3s 之间,一般的视频会议,互动式直播,完全是够用的。

  • 当然 RTMP 并没有尽善尽美,它也有不足的地方。一方面是它是基于 TCP 传输,非公共端口,可能会被防火墙阻拦;另一方面,也是比较坑的一方面是 RTMP 为 Adobe 私有协议,很多设备无法播放,特别是在 iOS 端,需要使用第三方解码器才能播放。

FLV (Flash Video) 是 Adobe 公司推出的另一种视频格式,是一种在网络上传输的流媒体数据存储容器格式。

其格式相对简单轻量,不需要很大的媒体头部信息。整个 FLV 由 The FLV Header, The FLV Body 以及其它 Tag 组成。因此加载速度极快。采用 FLV 格式封装的文件后缀为 .flv。

  • HTTP-FLV 依靠 MIME 的特性,根据协议中的 Content-Type 来选择相应的程序去处理相应的内容,使得流媒体可以通过 HTTP 传输。相较于 RTMP 协议,HTTP-FLV 能够好的穿透防火墙,它是基于 HTTP/80 传输,有效避免被防火墙拦截。除此之外,它可以通过 HTTP 302 跳转灵活调度/负载均衡,支持使用 HTTPS 加密传输,也能够兼容支持 Android,iOS 的移动端。
  • 说了这么多优点,也来顺便说下 HTTP-FLV 的缺点,由于它的传输特性,会让流媒体资源缓存在本地客户端,在保密性方面不够好。因为网络流量较大,它也不适合做拉流协议。

HLS (HTTP Live Streaming) 则是苹果公司基于 HTTP 的流媒体传输协议。

主要应用于 iOS 设备,包含(iPhone, iPad, iPod touch) 以及 Mac OSX 提供音视频直播服务和录制内容(点播)等服务。

  • 相对于常见的流媒体协议,HLS 最大的不同在于它并不是一下请求完整的数据流。它会在服务器端将流媒体数据切割成连续的时长较短的 ts 小文件,并通过 M3U8 索引文件按序访问 ts 文件。客户端只要不停的按序播放从服务器获取到的文件,从而实现播放音视频。
image.png

总结

HTTP-FLV 使用类似 RTMP流式的 HTTP 长连接,需由特定流媒体服务器分发的,兼顾两者的优点。以及可以复用现有 HTTP 分发资源的流式协议。它的实时性和 RTMP 相等,与 RTMP 相比又省去了部分协议交互时间,首屏时间更短,可拓展的功能也更多。 HLS 作为苹果提出的直播协议,在 iOS 端占据了不可撼动的地位,Android 端也同时提供相应的支持。

虚拟机的ip 怎么在局域网访问?

  • 修改完桥接模式后 关机重启,并且重启服务

ob的相关配置(略过,应用级别的软件,自己去看吧)

如果想用ffmpeg推送直播

  • 识别当前系统的摄像头 ./ffmpeg -f avfoundation -list_devices true -i ""
  • 打开摄像头开始推送 ./ffmpeg -f avfoundation -framerate 30 -s 1280x720 -i "0" -vcodec libx264 -an -preset veryfast -f flv rtmp://172.16.131.131/myapp/m

怎么推送已经录制好的视频

zhangguofu@localhost bin $ ./ffmpeg -re -i ../file/ylm.flv -c copy -f flv rtmp://192.168.8.141/myapp/m 相关命令解释

  • "-re":按视频帧率的速度读取输入
  • "-c copy":输出流使用和输入流相同的编解码器
  • "-f flv":指定输出流封装格式为flv

服务器如何保存流媒体

  • 在rmtp模块下面有一个record功能,用来保存流媒体数据,小虫摘取部分配置文件如下

        application myapp {
            live on;
            gop_cache on; #打开GOP缓存,减少首屏等待时间
            recorder rec1{
                record all;
                record_unique on;
                record_path /tmp/record;
                record_suffix -%Y-%m-%d-%H_%M_%S.flv;# 缓存的文件名称和格式
            }

        }

  • 执行以下操作推流一个视频 ./ffmpeg -re -i ../file/ylm.flv -c copy -f flv rtmp://172.16.131.131/myapp/m
  • 查看是否存储
  • 至此,本教程演示完毕,但是 关于直播的技术,肯定不限于此,比如直播的滤镜功能,比如http模块的Control 控制器,
  • 再细说一下Control 控制器 它可以通过 HTTP 协议从外部控制rtmp模块。通过 Control 控制器,我们可以使用 record、 drop 和 redirect 这 3 个命令来实现我们的业务场景。
    • 通过 record 命令,可以实现录制与停止直播流功能。
    • rtmp_stat 是流数据统计模块,在 http 模块中配置它 ,可以通过 URL 实时监控流媒体的各种状态 。
    • 可以通过 drop 命令有选择地踢出推流用户或拉流用户。
    • 可以通过 redirect 命令有选择地重定向推流用户 或拉流用户 。

直播课程至此演示完毕!感谢大家观看