一、前言

  • 随着时代的改变,人们对于内容的需求也不断提高,从文字到图片到音频、视频,可能到以后的 VR
  • 直播是一个非常烧钱的项目,需要足够多的带宽,足够好的服务器,比如负载均衡,这里还会扯到云等等,保证大数据并发,百万人同时访问等等
  • 涉及到一些专业的视频相关的知识,也需要很长时间的学习,如解码(硬解、软解)、编码、转码,还有底层的 ffmpeg(录制、转换以及流化音视频的完整解决方案)
  • 涉及到 即时通讯 和 美颜处理,其中美颜涉及到 OpenGL ,以及基于 OpenGL 的图像/视频处理框架 GPUImage
  • 涉及到 CDN:(Content Delivery Network),即内容分发网络,将网站的内容发布到最接近用户的网络”边缘”,使用户可以就近取得所需的内容,解决 Internet 网络拥挤的状况,提高用户访问网站的响应速度.
  • 一个简单的模型:主播-->直播流媒体服务器--> 多个用户同时观看
  • 简单的流程:采集(流)-->编码-->传输-->解码-->播放
  • 移动端主要协议
    • RTMP 协议 Macromedia(Adobe) 公司协议
    • HTTP Live Streaming(HLS) Apple 公司协议
    • HLS流和RTMP对比:
      HLS 主要是延时比较大 ,基于 HTTP
      RTMP 主要优势在于延时低,基于 TCP

二、阶段

  • 1、客户端拿到服务器分配好的 URL 直接解码播放直播视频。直接客户端拉流
  • 2、自己搭建服务器,播放的流自己控制。服务器推流,客户端拉流
  • 3、调用客户端摄像头等进行录制,客户端推流,服务器接受流

三、各阶段简要说明

1、拿到 URL 进行解码播放直播的视频

  • 使用 ijkplayer ,可从网上找别人打包好的静态库,直接拖到工程中使用
  • 直接用 IJKFFMoviePlayerController 创建 player,设置 player 中属性 view 的尺寸,加入到控制器的 view 上
  • 界面不播放,最好要记得结束播放
@interface ViewController ()
@property (nonatomic, strong) id<IJKMediaPlayback> player;
@end@implementation ViewController
- (void)viewDidLoad {[super viewDidLoad];self.player = [[IJKFFMoviePlayerController alloc]initWithContentURL:[NSURL URLWithString:@"rtmp://live.hkstv.hk.lxdns.com/live/hks"] withOptions:nil];// 设置 player 中 view 属性的frame,且加入到控制器的 view 中self.player.view.frame = self.view.bounds;[self.view addSubview:self.player.view];// 设置 横屏时自动伸缩self.player.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;[self.player prepareToPlay];[self.player play];
}
- (void)viewDidDisappear:(BOOL)animated {[super viewDidDisappear:animated];[self.player stop];self.player = nil;
}

2、自己搭建服务器,服务器推流,客户端拉流

  • mac 环境推荐搭建 Nginx + rtmp ,可网上搜索怎么搭建的
  • 配置 nginx.conf
    • 支持 rtmp
nginx.conf, 找到/usr/local/etc/nginx/nginx.conf 文件,http {……
}
# 在http节点下面(也就是文件的尾部)加上rtmp配置:
rtmp {server {listen 1935;application xxx {live on;record off;}}
}说明:
rtmp是协议名称
server 说明内部中是服务器相关配置
listen 监听的端口号, rtmp协议的默认端口号是1935
application 访问的应用路径是 xxx
live on; 开启实时
record off; 不记录数据
  • 支持 hls
只是简单的修改下配置文件 nginx.conf 即可
1.打开 /usr/local/etc/nginx/nginx.conf
2.找到 http 下的 server ,在花括号中增加
server {listen       8080;server_name  localhost;location / {root   html;index  index.html index.htm;}#HLS配置开始,这个配置为了`客户端`能够以http协议获取HLS的拉流location /hls {# Serve HLS fragmentstypes {application/vnd.apple.mpegurl m3u8;video/mp2t ts;}root html;add_header Cache-Control no-cache;}#HLS配置结束error_page   500 502 503 504  /50x.html;location = /50x.html {root   html;}}找到rtmp 下的  server 在花括号中增加rtmp {server {listen 1935;application xxx {live on;record off;}#增加对HLS支持开始#推流必须是基于H264/AAC格式application hls {live on;hls on;hls_path /usr/local/var/www/hls;}#增加对HLS支持结束}
}
  • 配置完 config 后
    nginx -s reload
  • ffmpeg 命令测试 rtmp
    • 命令:该命令会开启桌面分享、音频、视频
ffmpeg -f avfoundation -framerate 30 -i "1:0" -f avfoundation -framerate 30 -video_size 640x480 -i "0" -c:v libx264 -preset ultrafast -filter_complex 'overlay=main_w-overlay_w-10:main_h-overlay_h-10' -acodec libmp3lame -ar 44100 -ac 1  -f flv rtmp://192.168.33.245:1935/xxx/room
  • rtmp 地址
rtmp://192.168.33.245:1935/xxx/room
    • 该 rtmp 地址中,ip地址和 xxx/room 自行根据自己的配置替换,room 暂时可随便写,具体怎么分配还不是很清楚

      • 开启后如下
      • 测试:
      • 1、就可以在 VLC 中打开网络 URL,输入 rtmp 地址就可以测试了
      • 2、也可在 Xcode 项目中用 ijkplayer框架在模拟器中测试该地址(拉流)
  • ffmpeg 命令测试 hls
    • 转换测试
ffmpeg -loglevel verbose -re -i /Users/HOWIE-CH/Desktop/1.mp4 -vcodec libx264 -vprofile baseline -acodec libmp3lame -ar 44100 -ac 1 -f flv rtmp://localhost:1935/hls/1
  • 命令后如下
+ 查看 然后你就可以在这个目录 /usr/local/var/www/hls 看到生成一个个ts的文件,还会生成一个你的 m3u8 的文件名称.m3u8的文件 

+ 测试地址:http://localhost:8080/hls/你的m3u8的文件名称.m3u8
+ 测试方法1、用 safari 浏览测试2、也可在 Xcode 项目中用 ijkplayer框架在模拟器中测试该地址(拉流)

3、客户端推流

  • 相关第三方框架:

    • GDLiveStreaming 是对开源框架 VideoCore 简单封装.提供视频录制,推送与存储
    • https://github.com/goodow/GDLiveStreaming.git
#import "ViewController.h"
#import <GDLiveStreaming/GDLRawDataOutput.h>
#import <GPUImage/GPUImageVideoCamera.h>
#import <GPUImage/GPUImageView.h>
@interface ViewController ()
@property (nonatomic, strong) GPUImageVideoCamera *camera;
@end
@implementation ViewController
- (void)viewDidLoad {[super viewDidLoad];//  1. 创建视频摄像头self.camera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPreset1280x720cameraPosition:AVCaptureDevicePositionBack];//  2. 设置摄像头帧率self.camera.frameRate = 25;//  3. 设置摄像头输出视频的方向self.camera.outputImageOrientation = UIInterfaceOrientationPortraitUpsideDown;//  4. 创建用于展示视频的GPUImageViewGPUImageView *imageView = [[GPUImageView alloc] init];imageView.frame = self.view.bounds;[self.view addSubview:imageView];//  4.1 添加GPUImageView为摄像头的的输出目标[self.camera addTarget:imageView];//  5. 创建原始数据输出对象GDLRawDataOutput *output = [[GDLRawDataOutput alloc] initWithVideoCamera:self.camera withImageSize:CGSizeMake(720, 1280)];//  5.1 添加数据输出对象为摄像头输出目标[self.camera addTarget:output];//  6.开启前置摄像头, 不写这句代码默认开启的是后置摄像头[self.camera rotateCamera];//  7.开始捕获视频[self.camera startCameraCapture];//  8.开始上传视频[output startUploadStreamWithURL:@"rtmp://192.168.33.245:1935/zhanghao" andStreamKey:@"room"];
}
@end
  • mac 电脑(搭建 Nginx 服务器)网段和真机的网段最好是同一局域网网段下,或者用外网测试
  • 真机做推流到 mac上(搭建 Nginx 服务器),然后用 Xcode 里模拟器当其他客户端拉流
  • 真机 debug 打印

  • 模拟器中

四、其他

  • 直播要考虑的问题很多

    • 主要是延迟:转发环节越多,延迟越大;长连接会比短连接会降低延迟
    • 网络不稳定时,断线自动重连
    • ...
  • 直播已有一些 SDK ,如暴风云直播、七牛云直播、网易云信直播 SDK、腾讯直播 SDK 等,可选性比较多,第三方框架也比较多,当然也有通过自己封装的协议进行直播的

转载于:https://www.cnblogs.com/howie-ch/p/5828129.html

直播技术初体验,简单实现直播不同阶段相关推荐

  1. 音视频开发(23)---音视频直播技术--10分钟搭建好直播平台

    音视频直播技术--10分钟搭建好直播平台 前言 今天给大家讲一下如何搭建最简单的音视频直播平台.在之前的文章中我已经给大家介绍过音视频直播技术架构,没看过的同学可以看一下.了解了直播的技术架构,我们就 ...

  2. 前端如何实现整套视频直播技术流程(以打扑克直播软件为例)

    前端如何实现整套视频直播技术流程目录大纲: 直播技术的简单介绍 前端搭建使用的技术 实践效果 后续需要深入的地方 打扑克直播软件视频直播技术简介: 首先说明,本篇文章是概念+实践,对于希望了解和实践一 ...

  3. 布卡互动:领先行业的直播技术,给用户最佳直播体验

    随着在线直播平台的火热,各类直播节目被广泛关注,央视的新闻直播失误集锦也在网上疯转,央视主播一向给人端庄.严谨的形象,出现口误以后依旧面不改色与画风极为不符的反差让网友直呼尴尬症犯了. 近日,央视直播 ...

  4. 自动识别技术初体验,8个RFID应用方案合集

    射频识别技术是自动识别技术的一种,通过无线射频方式进行非接触双向数据通信,利用无线射频方式对记录媒体(电子标签或射频卡)进行读写,从而达到识别目标和数据交换的目的,其被认为是21世纪最具发展潜力的信息 ...

  5. Steaming技术初体验

    背景 1.对win10自带的远程桌面不满 2.在电报群,求助有没有很棒的解决方案. 3.有人推荐了game steaming技术: 4.体验了4个多小时, 5.软件包括RainWay.MoonLigh ...

  6. 学习Docker之Docker初体验 简单用例---SpringBoot集成Docker的部署、发布与应用

    简单用例 简单的创建一个工程,实现一个接口即可,然后在pom中添加docker插件,相关代码如下 @SpringBootApplication @RestController public class ...

  7. AddressSanitizer 技术初体验

    简介 AddressSanitizer 是 Google 开发的一款用于检测内存访问错误的工具,用于解决 use-after-free 和内存泄漏的相关问题.它内置在 GCC 版本 >= 4.8 ...

  8. python 项目发布会_发布会直播技术及业务实践

    一.背景 随着直播行业的近年来的发展,直播技术现已日趋成熟.本文主要介绍目前主流的直播技术原理,以及在直播在发布会场景下的应用以及过程中遇到的问题及解决方案. 二.直播原理 2.1 流媒体技术 2.1 ...

  9. 【知识库专访】亲加CTO郝飞:直播技术架构解密与优化之道

    from: http://geek.csdn.net/news/detail/106068 中国已在2016年进入直播+时代,这种成本低廉.互动性高.部署便捷.稳定可靠的娱乐方式,最初仅仅局限于游戏直 ...

最新文章

  1. 2016全国大学生计算机设计大赛,2016年“第9届中国大学生计算机设计大赛”闭幕...
  2. a high quality start up vc in uk
  3. android Integer类的toString函数的使用
  4. scikit-learn:通过Non-negative matrix factorization (NMF or NNMF)实现LSA(隐含语义分析)...
  5. 小米2s自带rec刷root_刷Magisk模块开机卡Logo了怎么办?两种方法教你轻松解决
  6. Net学习日记_ASP.Net_MVC_新语法笔记
  7. ES6_let和const_note
  8. SCOM 2012 R2监控Microsoft Azure服务(2)配置Azure监控
  9. oracle删除还原点,【赵强老师】删除表和Oracle的回收站
  10. 【Python-3.5】Pygal模拟骰子点数,分析结果可视化
  11. 3732 Ahui Writes Word
  12. 以太坊 ERC EIP是什么
  13. .net中的lock
  14. Nmap (网络扫描工具)
  15. Web前端开发的项目开发流程
  16. 【HTML粉色跳动爱心】效果展示+源代码
  17. 12.8 创建空白图片
  18. win7打开计算机有嘟嘟提示音,大神研习win7系统电脑开机经常发出嘟嘟哔哔的声音的解决技巧...
  19. oracle求整数取余,oracle 取余 取整 字符串连接
  20. 「AI芯片公司」比特大陆的路线图上,除了四款TPU还有在这三个产业落地的野心

热门文章

  1. pmp每日三题(2022年3月15日)
  2. 正则表达式--密码复杂度验证--必须包含大写、小写、数字、特殊字符中的至少三项
  3. 前端性能优化(PC版)
  4. PHP面试题:PHP加速模式/扩展? PHP调试模式/工具?
  5. SQL基础【十三、通配符】
  6. Linux CenOS Python3 和 python2 共存
  7. Windows下安装和配置tomca(免安装版本)
  8. AlertView动画
  9. Windbg调优Kafka.Client内存泄露
  10. Hello Mybatis 03 数据关联