初始化输出格式:
avformat_alloc_output_context2申请输出上下文
avformat_new_stream在媒体文件上添加一个新的流
添加视频流信息
初始化编码器
avcodec_find_encoder根基输出格式结构体的编码器id获取编码器
avcodec_alloc_context3申请编码器上下文
填充编码器上下文的数据结构(编码器id,码率,分辨率,帧率,像素格式等)
如果是H264:av_opt_set
avcodec_open2打开编码器
avcodec_parameters_from_context从输出格式结构体填充编码器上下文
初始化视频帧
av_frame_alloc申请帧数据资源
av_frame_get_buffer申请buff从帧数据中
sws_getContext初始化帧转换上下文
avio_open打开输出文件
avformat_write_header写视频流的头
开始循环录屏
获取一帧数据
XGetImage截屏
av_frame_make_writable确保AVFrame是可写的
填充一个AVFrame帧的的data段XGetPixel,XDestroyImage
视频帧转换 将RGB24格式转换为需要的格式
av_frame_make_writable确保AVFrame是可写的
sws_scale将获取的RGB帧转换为需要的帧格式
编码
av_packet_alloc申请一个包的资源
avcodec_send_frame向编码器发送一个帧
avcodec_receive_packet接收编码的一个包
写入一个包
av_packet_rescale_ts重新调整包的时间戳从编码器到流的时间基值上
av_interleaved_write_frame写一个编码后的包到媒体文件
av_packet_unref释放包占用的资源
停止录屏
编码一个值为NULL的帧并写入文件中
av_write_trailer写文件尾
释放资源
av_frame_free
av_packet_free
avcodec_free_context
sws_freeContext
avformat_free_context
关闭x11
XCloseDisplay