基于RTMP的音视频拉流实现2

基于RTMP拉流的实现
  1. 时钟与同步
  • AVSync类:采用Audio Master方式
    • 初始化时钟
    • 获取主时钟
    • 更新音视频时钟
    • 视频进行同步:
      视频慢了则丢掉部分视频帧(视觉->画⾯跳帧)
      视频快了则继续渲染上⼀帧
  • Clock类:
double pts_;  	// 时钟基础, 当前帧(待播放)显示时间戳
double pts_drift_;  // 当前pts与当前系统时钟的差值, audio、video对于该值是独⽴的
double last_updated;	 // 最后更新的系统时钟
double speed; 			// 时钟速度控制,控制播放速度
int serial; 	// 播放序列,所谓播放序列就是⼀段连续的播放动作,⼀个seek操作会启动⼀段新的播放序列
int paused; 	// = 1 说明是暂停状态    
int *queue_serial_;    //指向当前数据包队列序列的指针
char name_[MAX_NAME_SIZE+1]; //标注时钟类型
  • 主要函数:

    • 设置当前时钟:set_clock(double pts, int serial), set_clock_at(double pts, int serial, double time)
    • 获取当前时钟:get_clock()
  • 时钟的工作原理:
    时钟原理

    • 需要不断“对时”。对时的⽅法 set_clock_at(Clock *c, double pts, int serial, double time) ,需要⽤pts、serial、time(系统时间)进⾏对时。
    • 获取的时间是⼀个估算值。估算是通过对时时记录的pts_drift估算的。
    • 1)set_clock 进⾏一次对时,假设这时的 pts 是落后时间 time 的,那么计算 pts_drift = pts - time,计算出pts和time的相对差值。
      2)经过一段时间,且在下次对时前,通过 get_clock 来查询时间,因为set_clock时的 pts 已经过时,不能直接拿set_clock时的pts当做这个时钟的时间。
      3)可以通过相对差值 pts_drift,并根据当前时刻的时间来估算当前时刻的pts: pts = time + pts_drift。
  1. 音视频的解码
    解码线程独⽴于数据获取线程,其中PacketQueue用于存放从数据获取线程取到的播放时间内的AVPacket。FrameQueue用于存放各自解码后的AVFrame。Clock用于同步⾳视频。解码线程负责将PacketQueue数据解码为AVFrame,并存⼊FrameQueue。
  • AudioDecodeLoop类:用于音频解码。
    AACDecoder类:封装了AAC解码器
    Init: 初始化解码器,设置参数。
    Loop: 循环:1.等待音频包队列足够数据;2.循环:解码,设置帧的pts,获取可写帧,放入FrameQueue。3.获取packet,向解码器发送packet。

  • VideoDecodeLoop类:用于视频解码。
    H264Decoder类:封装H264解码器,初始化解码器,解码packet。
    Init: 创建h264解码器;初始化解码器;初始化packet_queue_和frame_queue_的成员变量。
    Loop: 循环从包队列获取packet解码后放入图像队列。
    Post:用于相packet队列添加元素

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RTMP(Real-Time Messaging Protocol)是一种基于TCP的实时流传输协议,主要用于音视频数据的传输。RTMP客户端可以推流(将音视频数据上传至服务器),也可以拉流(从服务器获取音视频数据)。下面分别介绍RTMP客户端推流和拉流的步骤: 1. RTMP客户端推流过程步骤: (1)建立TCP连接:RTMP客户端需要先与服务器建立TCP连接。这个过程和HTTP协议中的TCP连接建立是类似的。 (2)协议握手:TCP连接建立后,客户端需要向服务器发送一个握手请求,服务器返回握手响应。这个过程用来确保客户端和服务器的通信协议是一致的。 (3)发送元数据:在握手完成后,客户端需要向服务器发送元数据(也称为元信息),包括视频的宽度、高度、帧率、编码方式等信息。 (4)发送音视频数据:当元数据发送完成后,客户端开始发送音视频数据。音视频数据按照一定的格式进行打包,然后通过RTMP协议发送到服务器。 (5)关闭连接:当推流完成后,客户端需要向服务器发送一个关闭连接的请求,服务器返回确认响应,然后关闭TCP连接。 2. RTMP客户端拉流过程步骤: (1)建立TCP连接:RTMP客户端需要先与服务器建立TCP连接。 (2)协议握手:TCP连接建立后,客户端需要向服务器发送一个握手请求,服务器返回握手响应。 (3)发送元数据请求:在握手完成后,客户端需要向服务器发送元数据请求,请求服务器发送音视频数据的元数据。 (4)接收音视频数据:当客户端收到服务器返回的元数据后,就可以开始接收音视频数据了。服务器按照一定的格式打包音视频数据,然后通过RTMP协议发送到客户端。 (5)关闭连接:当拉流完成后,客户端需要向服务器发送一个关闭连接的请求,服务器返回确认响应,然后关闭TCP连接。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值