美文网首页常用技术收集直播实现iOS成长之路
HLS推流的实现(iOS和OS X系统)

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

作者: 落影loyinglin | 来源:发表于2016-09-23 09:55 被阅读5014次

前言

使用VideoToolbox硬编码H.264
使用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


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

6、Safari浏览器拉流

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

7、VLC播放器拉流

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

总结

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

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

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

相关文章

网友评论

  • newjourney2018:音视频流的时间戳怎么解决的,ffmpeg报找不到时间戳?
  • 小凡凡520:大神 求带
  • figure_ai:请问一下有没有关于rtmp配置的相关知识?
  • TigerNong:大神,求助!!!使用电脑进行推流:fmpeg -f avfoundation -framerate 30 -i "1:0" -f avfoundation -framerate 30 -video_size 640x480 -i "0" -c:v libx264 -preset slow -filter_complex 'overlay=main_w-overlay_w-10:main_h-overlay_h-10' -acodec libmp3lame -ar 44100 -ac 1 -f flv rtmp://192.168.1.101:1935/rtmplive/room 这样是可以进行推流,但是如果手机端使用LFLiveKit,URL:rtmp://192.168.1.101:1935/rtmplive/room时不能进行推流,总是连接不上!!!还有电脑推流成功后,模拟器能够进行拉流,但是手机也不能进行拉流!求助!求助!求助!!! (我的手机和电脑都是连接同一个,唯一路由器的WIFI)
  • 携一两本单色书来:你好,我用的LFliveKit推的流到服务器,但是后台给的m3u8地址无法播放,m3u8文本里面有ts片段的地址,这个可能是什么原因造成的呢?
    携一两本单色书来:后台那边说rtmp播放器能看,hls不行~~
  • 大心脏:老大,请问配置2要写在哪里啊,首中尾的位置都试过了,还是不行?
    重启Nginx报错nginx: [emerg] unknown directive "rtmp" in /usr/local/etc/nginx/nginx.conf:129
  • Wow_我了个去:使用LFLiveKit推流,LFLiveSession状态是已连接。但是报错ERROR: RTMP_Connect0, failed to connect socket. 65 (No route to host),这个是什么原因嘞?使用ffmpeg推是可以在vlc播放 :pray:
    落影loyinglin:@Wow_我了个去 你查查IP变了没
    Wow_我了个去:@落影loyinglin 不是的。就本机ip rtmp://192.168.200.241:1995/liveApp/room 局域网
    落影loyinglin:@Wow_我了个去 socket建立连接失败,应该是你的地址错误了,你是不是使用了localhost。
  • 899e2d74bdeb:请教一下,HLS与RTP应该是两种不同的直播方式的,为什么LFLiveKit都支持的?
    落影loyinglin:@哎疯 是的
    899e2d74bdeb:@落影loyinglin 请问我这样理解对不对,我发现代码中推流地址是rtmp://172.17.44.151:1935/hls/abc,推流端是使用rtmp推流的,服务端和拉流端是遵循hls协议的。
    落影loyinglin:@哎疯 hls是点播实现直播的协议,rtp是一个实时传输协议。实现了就能支持呀,还支持rtmp呢
  • 899e2d74bdeb:请问一个问题,推流上去的视频数据,然后在播放出来,视频延迟特别大(显示出来的视频图像都是几十秒之前的,声音数据正常),请问这个问题大概跟什么有关(是自己的一套框架)。
    落影loyinglin:@哎疯 你说的解决方案就不错呀
    899e2d74bdeb:@落影loyinglin 我上面的问题说是视频延迟(其实现象是视频播放很慢),我发现了原因,其实是我在发送每个I帧之前都先分别发送了sps和pps,导致接收端播放出来的视频放慢了,然后我改成只在第一个I帧之前发送sps和pps,这个现象就解决了,但是这样导致视频直播开始之后,才进入房间的用户的视频播放失败,这是因为他们没有收到刚开始的sps和pps,导致视频解码失败,请问这个问题是不是要在服务器接收到客户端请求时,发送第一个package 加上 SPS、PPS,还是通过别的方法。
    落影loyinglin:@哎疯 几方面入手,一个是编码器,一个是上传,然后就是拉流的时间。还有一个是协议类型
  • 3480fa2908d3:你好~博主~~在配置nginx.conf 时候没有找到 2、配置Nginx,支持rtmp协议推流 中的代码是什么问题呢?
  • 无语真的无语:使用FFmpeg对前文生成的mp4文件进行推流 终端输入完后 显示Connection to tcp://localhost:1935 failed (Connection refused), trying next address 这是什么情况呢
    3480fa2908d3:@卖菜的小贩 什么原因啊 我也遇到了....
    无语真的无语:@落影lying-in 配置了,现在可以了
    落影loyinglin:@卖菜的小贩 你配置了nginx吗
  • Theodore_Pratt:时间那么短,还那么高产出是怎么做到的😂
    落影loyinglin:@ACoderBear 平均一周1到2篇而已。

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

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