关于直播

正处于难得的空档期,五一去和大学的基友去日本的东北玩了一大圈(东京-仙台-角馆-田泽湖-秋田-弘前-青森-东京),回来也该收收心了。周末无事,浅浅的研究了一下现在大热的直播技术。同时也在这里记录一下。

直播流程(原理)

PC端/IOS/Android -> 压缩编码过程(H.264/ACC)-> 字幕叠加(视频本身处理)-> 推流 -> CDN -> 直播(终端显示直播流)

直播协议

主流的差不多就这三个: HLS协议 RTMP协议 HTTP-FLV协议

  • HLS协议:Apple公司推出的,暂时只支持Safari,切片格式是ts。 实现原理具体就是video,它有一个M3U8索引文件。这个索引文件对应着数个ts格式的文件切片。

    M3U8文件只是当前时间段的索引,segment.ts都会有个时长,在segment总时长之前,video会重新向服务器请求m3u8文件,这是浏览器自身的行为,此时,服务器会返回新的m3u8文件,更新后的segment.ts文件将会改变(m3u8文件结构并不一定全是由ts文件组成,有可能会嵌套一层m3u8文件)

    对于ts文件来说:ts文件会有一个PAT的包,解析时,这个pat的包会告诉你去找一个PMT的包,PMT会告诉你后面要解析到的ts文件中,哪些是视频哪些是音频。

  • RTMP协议(Real Time Messaging Protocol)(实时性比较好不过使用起来比较复杂,传输的视频格式为flv)

  • HTTP-FLV结合了HLS的优点,采用HTTP请求,又结合了RTMP低延时的特性,因为中间建立了FLV的长连接,中间通信过程相对RTMP协议就不再复杂

    HTTP-FLV优点(相对RTMP):

    1. 可以在一定程度上避免防火墙干扰(有些机房只允许80端口通过)
    2. 可以很好的兼容HTTP 302跳转
    3. 可以使用HTTPS
    4. 很好的支持移动端

直播源的制作

  1. 我们需要安装Nginx,mac的话直接
  brew install nginx-full --with-rtmp-module

如果安装的时候遇到 不存在的问题:brew tap denji/nginx 换一个github源即可。

安装成功,启动Nginx,在http://localhost:8080/验证即可。

  1. 安装ffmpeg
  brew install ffmpeg
  1. 配置Nginx
cd /usr/local/etc/nginx/
code nginx.conf
rtmp{
    server {
        listen 1935;
        chunk_size 4000;

        # RTMP 直播流配置
        application rtmplive {
            live on;
            max_connections 1024;
        }

        # hls 直播流配置
        application hls{
            live on;
            hls on;
            hls_path /usr/local/var/www/hls;
            hls_fragment 5s;
        }
    }
}
        location /hls {
            types{
                application/vnd.apple.mpegurl m3u8;
                video/mp2t ts;
            }
            root /usr/local/var/www;
            add_header Cache-Control no-cache;
        }
  1. 准备视频 这里简单起见,在网上找一个mp4格式的测试视频模拟直播流

  2. 利用ffmpeg推流

这里分别尝试了两种协议的直播。推流方式分别是:

  • RTMP:ffmpeg -re -i test2.mp4 -vcodec libx264 -acodec aac -f flv rtmp://localhost:1935/rtmplive/rtmp

使用 VLC 打开 rtmp://localhost:1935/rtmplive/rtmp 直播成功√

  • hls:ffmpeg -re -i test2.mp4 -vcodec libx264 -acodec aac -f flv rtmp://localhost:1935/hls/stream

safar打开 http://localhost:8080/hls/stream.m3u8 直播成功√

青森·弘前:

END

読んでくれてありがとう~