作者:mobiledu2502861323 | 来源:互联网 | 2023-09-03 10:54
avcodec_send_packetavcodec_receive_frameH264帧分割ffmpeg-iv1080.mp4-s400x300test.h264我们使用这个命
avcodec_send_packet
avcodec_receive_frame
H264 帧分割
ffmpeg -i v1080.mp4 -s 400x300 test.h264
我们使用这个命令生成一个编码后的 h264 文件。
基于 ffmpeg 接口完成视频解码
117_test_decode.cpp
#include
#include using namespace std;extern "C" // 指定函数是 C 语言函数,函数目标名不包含重载标识,C++ 中调用 C 函数需要使用 extern "C"
{// 引用 ffmpeg 头文件#include "libavcodec/avcodec.h"
}// 预处理指令导入库
#pragma comment(lib, "avcodec.lib")
#pragma comment(lib, "avutil.lib")int main()
{//1 分割h264 存入AVPacket// ffmpeg -i v1080.mp4 -s 400x300 test.h264string file_name &#61; "test.h264";ifstream ifs;AVCodec* codec &#61; nullptr;AVCodecID codec_id &#61; AV_CODEC_ID_H264;AVCodecContext* context &#61; nullptr;AVCodecParserContext* parser &#61; nullptr;AVPacket* packet &#61; nullptr;AVFrame* frame &#61; nullptr;unsigned char inbuf[4096] &#61; { 0 };int inbuf_len &#61; 0;int ret &#61; 0;ifs.open(file_name, ios::in | ios::binary);if (!ifs){return -1;}//1 找解码器codec &#61; avcodec_find_decoder(codec_id);if (codec &#61;&#61; nullptr){cerr <<"avcodec_find_decoder failed!" < 0){// 通过 0001 截断输出到AVPacket 如果满足一个 AVPackret 则返回这个 AVPacket 的大小 不足一个AVPactet 则返回余下的数据大小 不足一个AVPactet的数据会被缓存起来int in_len &#61; av_parser_parse2(parser, context,&packet->data, &packet->size, // 输出data, len, // 输入AV_NOPTS_VALUE, AV_NOPTS_VALUE, 0);data &#43;&#61; in_len;len -&#61; in_len;if (packet->size > 0){// cout <size <<" " <}
我们打开h264文件读取数据到缓冲区中&#xff0c;对这片缓冲区中的数据进行解析&#xff0c;解析出 AVPacket&#xff0c;然后对 AVPacket 进行解码&#xff0c;解码出 AVFrame。
执行结果如下图所示&#xff1a;
我们打印了解码后原始帧的像素格式&#xff0c;0表示使用 YUV420P 像素格式。