了解整个编解码过程,编写demo将本地yuv视频通过编解码流程之后显示。
这是一个过渡任务,最开始是为了理清整个编解码过程,以及每个过程的重要函数。接着用来验证任务二(编解码类框架)的代码以及H265模块是否有问题。最后又结合任务二一起完成任务四的第一部分(为码流对比工具添加H265模块)。
整个编解码的过程如下:
首先是数据采集,在这个步骤中主要设置参数以及设置回调函数write_video_frame(参数包括设备参数,视频源分辨率。回调函数的作用是对采集到的数据进行处理)。接着就是设置编解码算法的必要参数。参数设置好之后开始采集数据start()。参数正确即触发回调函数。
由于任务二的整合编解码框架,这里编解码就很好初始化了
string config_text = make_XXX_video_config_json_text(codec_config);//将编解码配置参数格式化为字符串
m_video_encoder = video_encode_type::create(codec_id);//根据codec_id创建编码指针
m_video_encoder->setup_config(config_text);//设置参数
m_video_encoder->install_encode_hook(boost::bind(&CTestCodeDlg::decode_video_frame, this, _1, _2, _3));//编码完一帧马上解码
m_video_encoder->open();//打开编码器
m_video_decoder = video_decode_type::create(codec_id);//根据codec_id创建解码指针
m_video_decoder->setup_config(config_text);//设置参数
m_video_decoder->open();//打开解码器
write_video_frame->handle_video_frame->encode->decode->display.
1.这里其实是write_video_frame绑定handle_video_frame操作,handle_video_frame绑定encode操作。因为可能是多线程编解码。所以write和handle相当于两个队列操作。一个读队列,一个写队列。
2.这里有两次格式转换:
第一次编码之前 把任意格式转换成YUV420P 用来编码
第二次解码之后,显示之前。解码之后还是YUV420P格式,转换成RGB格式来显示