直播技术简介--简进祥

一、前言

  • 随着时代的改变,人们对于内容的需求也不断提高,从文字到图片到音频、视频,可能到以后的 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 fragments
            types {
                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、客户端推流

#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:AVCaptureSessionPreset1280x720
                                                      cameraPosition:AVCaptureDevicePositionBack];
    //  2. 设置摄像头帧率
    self.camera.frameRate = 25;
    //  3. 设置摄像头输出视频的方向
    self.camera.outputImageOrientation = UIInterfaceOrientationPortraitUpsideDown;

    //  4. 创建用于展示视频的GPUImageView
    GPUImageView *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 等,可选性比较多,第三方框架也比较多,当然也有通过自己封装的协议进行直播的
时间: 2024-10-05 23:03:40

直播技术简介--简进祥的相关文章

简进祥==iOS 3DES加密解密

3DES(或称为Triple DES)是三重数据加密算法(TDEA,Triple Data Encryption Algorithm)块密码的通称.它相当于是对每个数据块应用三次DES加密算法.由于计算机运算能力的增强,原版DES密码的密钥长度变得容易被暴力破解:3DES即是设计用来提供一种相对简单的方法,即通过增加DES的密钥长度来避免类似的攻击,而不是设计一种全新的块密码算法. 3DES又称Triple DES,是DES加密算法的一种模式,它使用3条56位的密钥对数据进行三次加密.数据加密标

简进祥===AFNetWorking 下载视频文件

获取沙盒中的Documents地址的代码. NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = [paths objectAtIndex:0]; 1 2 1 2 假设视频文件的网络url为http://www.abc.com/test.mp4,下载到iOS沙盒中的文件名为test.mp4. 利

简进祥--iOS开发基础知识

1:App跳转至系统Settings 跳转在IOS8以上跟以下是有区别的,如果是IOS8以上可以如下设置: NSURL *url = [NSURL URLWithString:UIApplicationOpenSettingsURLString]; if ([[UIApplication sharedApplication] canOpenURL:url]) { [[UIApplication sharedApplication] openURL:url]; } 如果要兼容IOS7则要设置在UR

流媒体技术简介

流媒体技术简介 随着互联网的普及,利用网络传输声音与视频信号的需求也越来越大.广播电视等媒体上网后,也都希望通过互联网来发布自己的音视频节目.但是,音视频在存贮时文件的体积一般都十分庞大.在网络带宽还很有限的情况下,花几十分钟甚至更长的时间等待一个音视频文件的传输,不能不说是一件让人头疼的事.流媒体技术的出现,在一定程度上使互联网传输音视频难的局面得到改善. 传统的网络传输音视频等多媒体信息的方式是完全下载后再播放,下载常常要花数分钟甚至数小时.而采用流媒体技术,就可实现流式传输,将声音.影像或

HTTP Live Streaming直播(iOS直播)技术分析与实现

http://www.cnblogs.com/haibindev/archive/2013/01/30/2880764.html 不经意间发现,大半年没写博客了,自觉汗颜.实则2012后半年,家中的事一样接着一样发生,实在是没有时间.快过年了,总算忙里偷闲,把最近的一些技术成果,总结成了文章,与大家分享. 前些日子,也是项目需要,花了一些时间研究了HTTP Live Streaming(HLS)技术,并实现了一个HLS编码器HLSLiveEncoder,当然,C++写的.其功能是采集摄像头与麦克

转: HTTP Live Streaming直播(iOS直播)技术分析与实现

http://www.cnblogs.com/haibindev/archive/2013/01/30/2880764.html HTTP Live Streaming直播(iOS直播)技术分析与实现 不经意间发现,大半年没写博客了,自觉汗颜.实则2012后半年,家中的事一样接着一样发生,实在是没有时间.快过年了,总算忙里偷闲,把最近的一些技术成果,总结成了文章,与大家分享. 前些日子,也是项目需要,花了一些时间研究了HTTP Live Streaming(HLS)技术,并实现了一个HLS编码器

直播技术(从服务端到客户端)二

播放 在上一篇文章中,我们叙述了直播技术的环境配置(包括服务端nginx,nginx-rtmp-module, ffmpeg, android编译,ios编译).从本文开始,我们将叙述播放相关的东西,播放是直播技术中关键的一步,它包括很多技术如:解码,缩放,时间基线选择,缓存队列,画面渲染,声音播放等等.我将分为三个部分为大家讲述整个播放流程: Android 第一部分是基于NativeWindow的视频渲染,主要使用的OpenGL ES2通过传入surface来将视频数据渲染到surface上

可穿戴技术简介

可穿戴技术简介 ---把科技穿在身上 1简介 可穿戴技术主要探索和创造能直接穿在身上.或是整合进用户的衣服或配件的设备的科学技术. 2目的 通过“内在连通性”实现快速的数据获取.通过超快的分享内容能力高效地保持社交联系.摆脱传统的手持设备而获得无缝的网络访问体验. 3技术产品 (1)Google Glass(谷歌眼镜) 2012年6月28日,谷歌通过I/O产品发布会发布了这款穿戴式IT产品.谷歌眼镜结合了声控.导航.照相与视频聊天等功能,预示了未来世界可能的样貌.一块右眼侧上方的微缩显示屏,一个

【活动】DevOps直播技术架构养成记

背景 半月前,参加了UCloud直播云的活动,主题"DevOps|直播技术架构养成记",很是不错的.能够整理出本篇博文,非常感谢参加会议的朋友们在微信群中提供的非常好的资料,以作分享. Now, go into! 低延迟.秒开? 网络视频直播存在已有很长一段时间,随着移动上下行带宽提升及资费的下调,视频直播被赋予了更多娱乐和社交的属性,人们享受随时随地进行直播和观看,主播不满足于单向的直播,观众则更渴望互动,直播的打开时间和延迟变成了影响产品功能发展重要指标.那么,问题来了:如何实现低