ffmpeg视频解码原理和实战-(1)对H264编码后的帧进行分割并存入AVPacket

源文件:

cpp 复制代码
#include <iostream>
#include <fstream>
using namespace std;
extern "C" { //指定函数是c语言函数,函数名不包含重载标注
//引用ffmpeg头文件
#include <libavcodec/avcodec.h>
}
//预处理指令导入库
#pragma comment(lib,"avcodec.lib")
#pragma comment(lib,"avutil.lib")
int main(int argc, char* argv[])
{
    //1 分割h264 存入AVPacket
      // ffmpeg -i v1080.mp4 -s 400x300 test.h264
    string filename = "test.h264";
    ifstream ifs(filename, ios::binary);
    if (!ifs)return -1;
    unsigned char inbuf[4096] = { 0 };
    AVCodecID codec_id = AV_CODEC_ID_H264;


    //1 找解码器
    auto codec = avcodec_find_decoder(codec_id);

    //2 创建上下文
    auto c = avcodec_alloc_context3(codec);

    //3 打开上下文
    avcodec_open2(c, NULL, NULL);


    //分割上下文
    auto parser = av_parser_init(codec_id);
    auto pkt = av_packet_alloc();
    while (!ifs.eof())
    {
        ifs.read((char*)inbuf, sizeof(inbuf));//将h264编码的流读入inbuf中
        int data_size = ifs.gcount();// 读取的字节数
        if (data_size <= 0)break;
        auto data = inbuf;
        while (data_size > 0) //一次有多帧数据
        {
           /* int av_parser_parse2(AVCodecParserContext * s, 
           AVCodecContext * avctx,
                uint8_t * *poutbuf, 
                int* poutbuf_size,
                const uint8_t * buf, 
                int buf_size,
                int64_t pts, 
                int64_t dts, 
                int64_t pos);
            s :指向 AVCodecParserContext 的指针,用于维护解析器的状态。
            avctx : 指向 AVCodecContext 的指针,包含解码器的上下文信息。
            poutbuf : 输出缓冲区的指针,解析出的完整帧将被存储在这里。
            poutbuf_size : 输出缓冲区的大小,以字节为单位。
            buf : 输入缓冲区的指针,包含需要解析的原始数据。
            buf_size : 输入缓冲区的大小,以字节为单位。
            pts : 输入数据包的演示时间戳(presentation timestamp)。
            dts : 输入数据包的解码时间戳(decoding timestamp)。
            pos : 输入数据包在文件中的位置。*/

            //通过0001 截断输出到AVPacket 返回帧大小
            int ret = av_parser_parse2(parser, c,
                &pkt->data, &pkt->size, //输出
                data, data_size,        //输入
                AV_NOPTS_VALUE, AV_NOPTS_VALUE, 0
            );//返回消耗的输入数据字节数ret。如果所有输入数据都被消耗,则返回值等于 buf_size。如果解析过程中出现错误,则返回负数。
            data += ret;
            data_size -= ret; //待处理的数据大小
            if (pkt->size)
            {
                cout << pkt->size << " " << flush;
            }
        }

    }
    av_packet_free(&pkt);

    getchar();
    return 0;
}
相关推荐
音视频牛哥1 小时前
AI浪潮下,实时音视频SDK正在经历怎样的价值重构?
人工智能·音视频·实时音视频·rtmp推流·低延迟rtsp播放器·低延迟rtmp播放器·rtsp转rtmp推流
乐橙开放平台2 小时前
明厨亮灶笔记:乐橙轻应用 H5 + 小程序插件,一套 BFF 出两张播放凭证
人工智能·笔记·物联网·小程序·音视频·notepad++
ofoxcoding2 小时前
Seedance 2.0 与 Wan 2026 视频生成 API 成本效率深度对比分析
网络·人工智能·ai·音视频
豌豆学姐3 小时前
likeadmin-api 视频生成工作流实战:Seedance 2.0 接口从素材到任务查询
aigc·音视频·api·视频生成·likeadmin-api
乐橙开放平台3 小时前
养殖 SaaS 笔记:乐橙 IoT 物模型管环境,视频 OpenAPI 管回看
数据库·笔记·物联网·mysql·音视频
山顶夕景21 小时前
【MAE】音频自监督训练Masked Autoencoders that Listen
音视频·ssl·多模态·自监督·mae
小码哥06821 小时前
短视频后台系统架构设计与行业应用深度分析-源码-技术支持
系统架构·音视频·短视频后台·短剧后台·微剧后台
小猴子爱上树1 天前
TikTok Shop视频自动翻译工具实战教程
人工智能·python·音视频·机器翻译
mzy80001 天前
AI漫剧视频生成项目——kimi自检
音视频
中微极客1 天前
视频Agent:从一次性生成到多轮编排架构
人工智能·架构·音视频