FFmpeg开发(1)从mp4中提取H264

该博客主要介绍了如何处理H264编码的视频数据,涉及SPS/PPS关键格式数据的位置,以及如何在关键帧前添加这些数据。通过函数`alloc_and_copy`和`h264_add`实现了对AVPacket的重新打包,确保关键帧携带必要的头部信息。代码示例展示了从MP4文件中读取视频流,分离出关键帧并写入新的H264文件的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

start code 关键字,标志一帧的结束和开始

SPS/PPS  视频的关键格式数据 在codec->extradata,放在每个关键帧开头

一个packet可能存放很多帧,也可能只有一帧

#include<iostream>
using namespace std;
extern "C"
{
#include "libavcodec/avcodec.h"
#include "libavformat/avformat.h"
#include "libswscale/swscale.h"
#include "libavutil/imgutils.h"
};


#ifndef AV_WB32
#   define AV_WB32(p, val) do {                 \
        uint32_t d = (val);                     \
        ((uint8_t*)(p))[3] = (d);               \
        ((uint8_t*)(p))[2] = (d)>>8;            \
        ((uint8_t*)(p))[1] = (d)>>16;           \
        ((uint8_t*)(p))[0] = (d)>>24;           \
    } while(0)
#endif

#ifndef AV_RB16
#   define AV_RB16(x)                           \
    ((((const uint8_t*)(x))[0] << 8) |          \
      ((const uint8_t*)(x))[1])
#endif


static int alloc_and_copy(AVPacket* out,
	const uint8_t* sps_pps, uint32_t sps_pps_size,
	const uint8_t* in, uint32_t in_size)///加特征值
{
	uint32_t offset = out->size;
	uint8_t nal_header_size = offset ? 3 : 4;//sps/pps特征码00 00 00 01四字节  其他的特征码00 00 01
	int err;

	err = av_grow_packet(out, sps_pps_size + in_size + nal_header_size);//扩容
	if (err < 0)
		return err;

	if (sps_pps)
		memcpy(out->data + offset, sps_pps, sps_
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值