ffmpeg源码学习-2、ffplay源码学习(qt环境搭建到代码解析)_qt ffmpeg源码方式(4)

收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。
img
img

如果你需要这些资料,可以戳这里获取

需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人

都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

set_default_window_size
stream_component_open;相应解码器,并创建相应的解码线程;视频、音频解码器字幕
	avcodec_alloc_context3;编解码器上下文结构体
	avcodec_parameters_to_context;将码流中的编解码器信息拷贝到新分配的编解码器上下文结构体
	avcodec_find_decoder;codec_id查找解码器
	音频
		audio_open
			SDL_Init
			SDL_getenv
			wanted_spec.callback = sdl_audio_callback;
		decoder_init
		decoder_start
			SDL_CreateThread(audio_thread)//创建音频解码线程
	视频
		decoder_init
		decoder_start
			SDL_CreateThread(video_thread)//创建视频解码线程
	字幕
		decoder_init
		decoder_start
			SDL_CreateThread(subtitle_thread)
//读取多媒体包数据放入对应的包缓冲队列中
for (;;)
	是否有seek请求
	缓存队列有足够的包,不需要继续读取数据
	av_read_frame;读取媒体数据、对应视频音频字幕
	packet_queue_put;音视频数据分别送入相应的queue、对应视频音频字幕

event\_loop 线程主要完成视频sdl显示及sdl的一些事件处理



//视频输出
event_loop
for (;😉
refresh_loop_wait_event
while (!SDL_PeepEvents)
av_usleep;remaining_time就是用来进行音视频同步的。
video_refresh;显示每一帧
frame_queue_peek
video_display
video_open;设置宽高,sdlwindows设置
SDL_SetRenderDrawColor
SDL_RenderClear
video_audio_display;播放声音
video_image_display;渲染视频
SDL_RenderPresent
sdl事件监听


sdl\_audio\_callback线程,主要完成声音的输出



//声音输出
sdl_audio_callback
while
audio_decode_frame
frame_queue_next
音频相关操作
update_sample_display
memcpy(stream, (uint8_t *)is->audio_buf


audio\_thread线程主要完成从音频包缓冲队列中拿包解码将解码后的帧数据放入帧缓冲队列中



//音频解码
audio_thread
while
decoder_decode_frame
for (;😉
avcodec_receive_frame;从解码器中收到解码出的帧
while
packet_queue_get;从包缓冲队列中获取包
avcodec_send_packet;发生包到解码器中
frame_queue_push;将解码出来的帧放到帧队列中


video\_thread线程主要是从视频包缓冲队列中拿包解码将解码后的帧数据放入帧缓冲队列中



//视频解码
video_thread
for (;😉
get_video_frame;获取解码后的视频帧
decoder_decode_frame
for (;😉
avcodec_receive_frame;从解码器中收到解码出的帧
while
packet_queue_get;从包缓冲队列中获取包
avcodec_send_packet;发生包到解码器中
queue_picture;将解码后的视频帧插入队列
frame_queue_peek_writable;检测队列是否有空间
set_default_window_size
frame_queue_push


### 2.2、如何做到音视频同步的


理论:在ffplay中 音视频同步有三种方式



以视频为基准,同步音频到视频
音频慢了就加快音频的播放速度,或者直接丢掉一部分音频帧
音频快了就放慢音频的播放速度
以音频为基准,同步视频到音频
视频慢了则加快播放或丢掉部分视频帧
视频快了则延迟播放
以外部时钟为准,同步音频和视频到外部时钟
根据外部时钟改版音频和视频的播放速度


### 2.2.1、以视频为基准,同步音频到视频


视频同步到音频是ffplay的默认同步方式。在视频播放线程中实现。视频播放函数video\_refresh()实现了视频显示(包含同步控制)。  
 **视频同步到音频的基本方法是**:如果视频超前音频,则不进行播放,以等待音频;如果视频落后音频,则丢弃当前帧直接播放下一帧,以追赶音频。


### 2.2.2、音频同步到视频


音频同步到视频的方式,在音频播放线程中,实现代码在audio\_decode\_frame()及synchronize\_audio()中。


### 2.2.3、以外部标准时钟为标准


具体细节之后研究  
 在之前双录写文件都是以标准时钟进行写入的


参考博客:  
 https://www.cnblogs.com/leisure\_chn/p/10307089.html


![img](https://img-blog.csdnimg.cn/img_convert/8c8a3f84a7ee3f0fb67d538afd9f18c6.png)
![img](https://img-blog.csdnimg.cn/img_convert/62c5b1e54ed0fdca0a0dea802a33bd9d.png)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新**

**需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)**

**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618679757)**

这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新**

**需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)**

**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618679757)**

  • 12
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值