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

前言

使用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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Linux驱动

31.Linux-wm9876声卡驱动(移植+测试)

本节学习目的 1)分析Linux中的OSS声卡系统 2)移植wm9876声卡 3)使用madplay应用程序播放mp3 1.声音三要素 采样频率 音频采样率是指...

4616
来自专栏SDNLAB

[新手指南]OPNFV,SDN for OpenStack

读过之前OpenStack基金会的NFV白皮书的粉丝,想必对OPNFV也不会陌生,本篇文章为大家介绍OPNFV的最新版本-Brahmaptura,帮您快速了解这...

5888
来自专栏吉浦迅科技

DAY23:阅读WDDM和TCC模式

2491
来自专栏FreeBuf

安全应急响应工具年末大放送

为了帮助安全分析师更好的完成工作,小编整理了一些现在比较流行的安全应急响应工具和资源,从磁盘镜像创建工具、内存分析工具到内存镜像工具、沙盒/逆向工具等,相信总有...

4816
来自专栏吉浦迅科技

NVIDIA正式宣布CUDA 6:支持统一寻址

NVIDIA今天正式宣布了最新版并行计算开发工具CUDA 6,相比此前的CUDA 5.5有着革命性的巨大进步。 NVIDIA表示,CUDA 6可以让并行编程前所...

3088
来自专栏程序员互动联盟

【专业技术】如何检测USB是否已经插入?

usb是我们现代生活中不可或缺的一个东西,大家平常只要使用电脑,肯定都接触过usb吧。本篇文章对于大部分同学来说并没有实际意义,主要面向想了解USB的一些同学,...

4135
来自专栏玄魂工作室

使用yo-get下载视频网站视频或其

前言 很多时候随时随地在线看视频不是那么容易,尤其是YouTube的视频(你懂得),所以遇到好的视频下载下来还是有必要的。今天给大家介绍就是一款下载视频站视频的...

5795
来自专栏ios 技术积累

ios抓包工具Charles

简书上已经有很多介绍怎么使用Charles的文章,这里就不搬砖了。 这篇文章主要记录下怎么破解Charles,今天无意发现了一个在线破解的,亲自试过了 可以...

3233
来自专栏Java3y

计算机网络【开山篇】

最近在看相关面经时,发现对于计算机网络的考察还是挺多的。于是就看回这些曾经做过的笔记复习了一下。

1521
来自专栏向治洪

移动端跨平台技术总结

概述 曾经大家以为在手机上可以像桌面那样通过 Web 技术来实现跨平台开发,却因为性能或其他问题而放弃,不得不针对不同平台开发多个版本。这也违背了跨平台开发的初...

3225

扫码关注云+社区

领取腾讯云代金券