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

img
img

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

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

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

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

1、源码ffplay.c迁移qt编译

首先尝试了再vs下是要msvc进行编译发现报错误

: “unistd.h”: No such file or directory

百度解决方案意思是再linux下开发的C程序都需要头文件unistd.h,但VC中没有个头文件,
所以用VC编译总是报错。但是根据网上的方法,自己定义,h文件发现汇报其他错误
在这里插入图片描述
参考链接:https://www.cnblogs.com/ManMonth/archive/2010/02/01/1661142.html [转]VC报错 ‘unistd.h’: No such file or directory

则改到qt中新建工程引入ffplay.c
效果图
在这里插入图片描述
注意点:
1)编译环境&参数传入在这里插入图片描述
2)运行时所需要的动态库和文件需要放过去
在这里插入图片描述

2、源代码解析

2.1、函数流程分析

参考公众号:txb玩linux中相关文章
在这里插入图片描述
入口函数main

main
	init_dynload;win32设置动态库当前路径警告
	av_log_set_flags
	parse_loglevel
	avdevice_register_all
	parse_options
	SDL_Init
	SDL_CreateWindow
	SDL_CreateRenderer
	stream_open
		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线程主要完成从音频包缓冲队列中拿包解码将解码后的帧数据放入帧缓冲队列中

img
img

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

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

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

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

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

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

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值