- 博客(6)
- 收藏
- 关注
原创 基于RTMP的音视频拉流实现3
要再增加⼀级缓冲区解决问题,即是从FrameQueue队列读取到Frame的数据后,先缓存到一个buffer⾥,然后再从该buffer读取数据给到SDL回调函数。这⾥的时间戳是 audio_buf 结束位置的时间戳,而不是 audio_buf 起始位置的时间戳,所以当 audio_buf 有剩余时需要减去。RTMPPlayer类:创建读取packet包线程,循环读取packet包放入相应的队列。Init:传递同步对象,packet queue对象,frame queue对象。
2023-05-02 14:11:31
215
原创 基于RTMP的音视频拉流实现2
Loop: 循环:1.等待音频包队列足够数据;2.循环:解码,设置帧的pts,获取可写帧,放入FrameQueue。3.获取packet,向解码器发送packet。初始化packet_queue_和frame_queue_的成员变量。H264Decoder类:封装H264解码器,初始化解码器,解码packet。Loop: 循环从包队列获取packet解码后放入图像队列。AudioDecodeLoop类:用于音频解码。VideoDecodeLoop类:用于视频解码。Init: 初始化解码器,设置参数。
2023-05-02 14:10:48
105
原创 基于RTMP的音视频拉流实现1
4)可非阻塞: push和pop的时候可以使用非阻塞的方式。2)时长计算:可以结算队列里的数据维持播放的时间长度。3)可阻塞:push和pop的时候可以使用阻塞的方式。1)有边界:可以设置最大缓存数量。6)可以唤醒队列进行退出。
2023-05-02 14:10:30
190
1
原创 RTMP推流的基本框架
8.VideoCapture类:继承CommonLooper,实现虚函数loop,不断循环以捕获视频数据。9.AudioCapture类:继承CommonLooper,实现虚函数loop,不断循环以捕获音频数据。3.RTMPPusher类:启动循环发送线程,将各种消息类型封装,然后基于RTMP发送到服务器。6.H264Encoder类:将接收的视频帧使用H264编码为packet。7.CommonLooper类:作为视频捕获和音频捕获的基类,多态。1.Properties类:用于保存相应的属性。
2023-04-23 18:00:53
312
原创 RTMP中Message和Chunk
如果一个流同时包含音频和视频数据包,它们将具有相同的Message Stream ID。Message StreamID 用于将音频和视频流标识为流的一部分。但是,每个音频和视频数据包都有自己的Chunk stream ID,用于将数据包标识为属于流中的特定Chunk stream。不同的 chunk stream ID 通常用于标识不同类型的数据、不同的数据来源,或者允许对 RTMP 协议中的数据传输进行更细粒度的控制。
2023-04-23 16:42:59
168
原创 ffmpeg音频重采样的实现
不同的⾳源有不同的格式,采样率等,所谓的重采样,就是改变⾳频的采样率、sample format、声道数等参数,使之按照我们期望的参数输出。c) 接收音频:从audio fifo中读取一帧数据并写入目标缓存。5.冲刷缓冲区,以及进行内存释放。
2023-04-23 15:27:08
332
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人