parent
							
								
									b1e7e8009a
								
							
						
					
					
						commit
						9b52cb2e2f
					
				| @ -0,0 +1,95 @@ | ||||
| # 视频解码流程 | ||||
| 
 | ||||
| ## 源码文件 | ||||
| 
 | ||||
| ``` | ||||
| <ffmpeg>/doc/examples/decode_video.c | ||||
| ``` | ||||
| 
 | ||||
| ## 代码调用流程 | ||||
| 
 | ||||
| [](https://xuleilx.github.io/images/decode_video.png) | ||||
| 
 | ||||
| 该流程并不是一个正常的流程,它假设了该文件是mpeg1video的编码格式,并且没有封装容器。 | ||||
| 通常情况下是需要解封装的,比如说拿到一个视频文件,并不知道是什么编码,这时候就需要解封装来了解容器里面数据流了。 | ||||
| 
 | ||||
| 首先我们先要了解ffmpeg的几个大类: | ||||
| 
 | ||||
| - AVFormat:封装、解封装、包含协议封装 | ||||
| - AVCodec:编解码 | ||||
| - AVFilter:音视频滤镜 | ||||
| - swscale:视频图像转换 | ||||
| - swresample:音频转换计算 | ||||
| - AVUtil :工具类 | ||||
| 
 | ||||
| # 视频解封装,解码,图像转换流程 | ||||
| 
 | ||||
| 根据ffmpeg的几个大类,介绍解码视频并显示的一般流程和操作,序号为程序调用顺序 | ||||
| 
 | ||||
| ## AVFormat:封装、解封装、包含协议封装 | ||||
| 
 | ||||
| ### 解封装 | ||||
| 
 | ||||
| ```c | ||||
| avformat_alloc_context 	#封装结构体分配内存 // 可以不调用,avformat_open_input会判断入参是否为NULL,自行分配 | ||||
| avformat_open_input     	#打开输入文件用于读取数据 | ||||
| avformat_find_stream_info#获取流信息 | ||||
| 针对每个stream处理 | ||||
|     - pFormatContext->nb_streams | ||||
|     - avcodec_find_decoder 	#根据流中的编码参数AVCodecParameters,查找是否支持该编码 | ||||
|     - 判断流的类型 pLocalCodecParameters->codec_type | ||||
|     - 保存AVCodecParameters和AVCodec,用于后续处理 | ||||
|      | ||||
| av_read_frame			#读取一包AVPacket数据包 | ||||
| ``` | ||||
| 
 | ||||
| ## AVCodec:编解码 | ||||
| 
 | ||||
| ### 解码 | ||||
| 
 | ||||
| ```c | ||||
| avcodec_alloc_context3 		#编解码结构体分配内存 | ||||
| avcodec_parameters_to_context#将解封装得到的编码参数AVCodecParameters赋值给编解码结构体 | ||||
| avcodec_open2 				#打开编码器 | ||||
| avcodec_send_packet 		#将解封装中得到的AVPacket数据包送给解码器 | ||||
| avcodec_receive_frame 		#读回一帧解码后的数据AVFrame | ||||
| ``` | ||||
| 
 | ||||
| ### AVPacket:压缩的数据包 | ||||
| 
 | ||||
| ``` | ||||
| av_packet_alloc 		#压缩的数据包分配内存 | ||||
| ``` | ||||
| 
 | ||||
| ## swscale:视频图像转换 | ||||
| 
 | ||||
| ``` | ||||
| sws_getContext 		#给SwsContext结构体分配内存 | ||||
| 
 | ||||
| sws_scale 			#视频图像转换 | ||||
| ``` | ||||
| 
 | ||||
| ## AVUtil :工具类 | ||||
| 
 | ||||
| ### AVFrame:解码后的数据帧 | ||||
| 
 | ||||
| ``` | ||||
| av_frame_alloc 		#解码后的数据帧分配内存 | ||||
| ``` | ||||
| 
 | ||||
| ### image | ||||
| 
 | ||||
| ``` | ||||
| av_image_alloc 		#分配内存用于存放一张图片 | ||||
| ``` | ||||
| 
 | ||||
| # 项目 | ||||
| 
 | ||||
| 该项目用于学习ffmpeg编解码 | ||||
| 使用qt主要是比较方便,后续采用glfw和sdl显示 | ||||
| 
 | ||||
| ## 功能描述 | ||||
| 
 | ||||
| 1. 使用FFMpeg解码 | ||||
| 2. 将FFMpeg解码后的yuv数据转换成rgb | ||||
| 3. 使用QT的QLabel组件,通过QImage显示rgb数据 | ||||
					Loading…
					
					
				
		Reference in new issue