美文网首页
HLS推流的实现(iOS和OS X系统)

HLS推流的实现(iOS和OS X系统)

作者: 辉辉岁月 | 来源:发表于2021-08-03 17:11 被阅读0次

    前言

    VideoToolbox硬编码H.264
    使用AudioToolbox编码AAC
    使用AudioToolbox播放AAC
    HLS点播实现(H.264和AAC码流)

    在前面我们介绍了从麦克风采集声音并用AudioToolbox编码成AAC码流从摄像头采集图像并用VideoToolbox编码成H.264码流,也尝试了把这两个格式的文件打包成TS流,并用通过HLS协议在浏览器播放,这一篇是在HLS点播实现(H.264和AAC码流)基础上的延续,进行HLS的推流。

    核心思路

    配置Nginx以支持HLS的推流与拉流,iOS系统使用LFLiveKit推流,OS X系统使用FFmpeg推流,拉流端可以使用Safari浏览器或者VLC播放器。

    效果展示

    具体步骤

    1、配置Nginx,支持http协议拉流

    在终端输入open -t /usr/local/etc/nginx/nginx.conf,找到图中代码位置,在下面插入配置信息。

    location /hls {
            #Serve HLS config
            types {
                application/vnd.apple.mpegurl    m3u8;
                video/mp2t ts;
            }
            root /usr/local/var/www;
            add_header Cache-Control    no-cache;
        }
    

    2、配置Nginx,支持rtmp协议推流

    在终端输入open -t /usr/local/etc/nginx/nginx.conf,找到图中代码位置,在下面插入配置信息。

          application hls{
              live on;
              hls on;
              hls_path /usr/local/var/www/hls;
              hls_fragment 1s;
          }
    
    

    3、重启Nginx

    在终端输入nginx -s reload,重启Nginx。

    如果在修改配置文件,重启遇到
    [error] open() "/usr/local/var/run/nginx.pid" failed
    可以用下面的命令重新加载配置
    nginx -c /usr/local/etc/nginx/nginx.conf

    4、OS X系统推流

    使用FFmpeg对前文生成的mp4文件进行推流(FFmpeg的安装看HLS点播实现(H.264和AAC码流)
    在终端输入指令:

    ffmpeg -re -i abc.mp4 -vcodec copy -acodec copy  -f flv rtmp://localhost:1935/hls/abc
    
    

    -vcodec copy 表示原有的编码,否则ffmpeg会重新编码,导致CPU飙升到200%以上
    简书上有些对已有文件的推流ffmpeg指令是ffmpeg -re -i abc.mp4 -vcodec libx264 -acodec aac ,这是不合理的地方,要特别注意!

    5、iOS系统推流

    新建一个Xcode工程,在podfile输入pod 'LFLiveKit',执行pod install
    附上简单开始推流代码:(LFLiveKit大赞)

    - (IBAction)onStart:(UIButton *)sender {
        if ([sender.currentTitle isEqualToString:@"开始直播"]) {
            [sender setTitle:@"结束直播" forState:UIControlStateNormal];
            LFLiveStreamInfo *stream = [LFLiveStreamInfo new];
            stream.url = @"rtmp://172.17.44.151:1935/hls/abc";
            [self.session startLive:stream];
        }
        else {
            [sender setTitle:@"开始直播" forState:UIControlStateNormal];
            [self.session stopLive];
        }
    }
    
    

    完整工程代码点这里:代码地址

    注意事项
    Nginx服务器是在Mac跑的,iOS推流端不能把推流地址写成localhost!!!
    在terminal输入ifconfig | grep inet

    image

    然后如果是局域网地址,iOS和Mac需要在同一个网络里面。

    6、Safari浏览器拉流

    打开Mac自带的Safari浏览器,在地址栏输入:
    http://localhost:8080/hls/abc.m3u8

    7、VLC播放器拉流

    打开VLC播放器,Command+N,在地址栏输入:
    http://localhost:8080/hls/abc.m3u8

    image

    总结

    本来想手写一次RTMP的推流,但是看到LFLiveKit之后,我觉得不用重复造轮子了,其详细的代码已经足够深入学习。
    至此,我们熟悉了以下知识点:

    • 采集视频源和音频源的数据,视频采用H264编码,音频采用AAC编码
    • 视频和音频数据使用FFmpeg封装为MPEG-TS包和MP4文件
    • 使用FFmpeg推流

    想深入了解rtmp的推流过程、应对网络变化的丢帧策略等可以看LFLiveKit的源码。
    附上收藏的FFmpeg指令:
    FFmpeg常用指令
    FFmpeg常用指令2

    相关文章

      网友评论

          本文标题:HLS推流的实现(iOS和OS X系统)

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