收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。
需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人
都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
frame_queue_init;创建循环帧队列,视频音频字幕
packet_queue_init;创建循环包队列,视频音频字幕
SDL_CreateCond;
init_clock ;初始化时钟 视频音频字幕
SDL\_CreateThread(read_thread)
event_loop
read\_thread线程主要完成解封装,读取多媒体包数据放入包缓冲队列中,
read_thread
//解封装
avformat_alloc_context;创建上下文结构体
interrupt_callback.callback = decode_interrupt_cb;设置中断回调函数
avformat_open_input;打开文件
avformat_find_stream_info;探测媒体类型,
avformat_seek_file;需要指定起始位置
is_realtime;是否为实时流媒体
av_find_best_stream;将为流的编解码器找到默认的解码器,视频音频字幕
av_guess_sample_aspect_ratio
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中 音视频同步有三种方式
以视频为基准,同步音频到视频
音频慢了就加快音频的播放速度,或者直接丢掉一部分音频帧
音频快了就放慢音频的播放速度
以音频为基准,同步视频到音频
视频慢了则加快播放或丢掉部分视频帧
视频快了则延迟播放
以外部时钟为准,同步音频和视频到外部时钟
根据外部时钟改版音频和视频的播放速度
收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。
需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人
都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
topics/618679757)**
需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人
都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!