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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容