FFmpeg解封装

FFmpeg SDK软硬解码基础

解封装,软硬件解码,像素格式转换,重采样,pts/sts,同步策略

解封装

·av_register_all();		//注册所有格式
·avformat_network_init();	//要打开网络摄像头
·avformat_open_input(...);	//打开视频、摄像头
·avformat_find_stream_info(..);//查找流
·av_find_best_stream(...);//查找格式

//涉及三个结构体
AVFormatContext AVStream AVPacket
AVFormatContext;
AVStream;
AVPacket;

av_read_frame();//读取AVPacket一帧的信息;

int avformat_open_input

确保av_register_all avformat_network_init 已调用
AVFormatContext **ps;
const char *url;//地址
AVInputFormat *fmt;//输入封装格式,输入NULL,自动探测
AVDictionary **options;//一组类似键值对,参数设置,打开文件几乎用不到,打开视频流

AVFormatContext

AVIOContext *pb;//文件io上下文
char fileanem[1024];//文件名
unsigned int nb_streams;//所有流的数
AVStream **streams;//音视频信息
int64_t duration;//以AV_TIME_BASE单位,微秒值,不一定能获取到,音视频长度
int64_t bit_rate;//比特率

//释放函数
void avformat_close_input(AVFormatContext **s);

AVStream

AVCodecContext *codec;//过时了
AVRational time_base;//时间基数,有理数,是一个分数,
int64_t duration;//转换成毫秒 duration*((double)time_base.num/(double)time_base.den)*1000
AVRational avg_frame_rate;//一秒钟有多少帧


AVCodecParameters *codecpar;//(音视频参数)用来替代codec

AVCodecParameters

enum AVMediaType codec_type;
enum AVCodecID codec_id;
uint32_t codec_tag;//四个字节表示编码器
int format;//表示像素格式或者音频采样格式
int width; int height;//宽高
uint64_t channel_layout;//声道
itn channels;//声道数
int sample_rate;//样本率
int frame_size;//一帧音频的大小

av_read_frame

AVFormatContext *s;
AVPacket *pkt;//需要考虑内存释放问题,不能传入NULL,重复使用的时候需要清理

//返回0正确,返回<0 文件末尾,或者错误

AVPacket

AVBufferRef *buf;
int64_t pts;//pts * (num/den) 显示时间
int64_t dts;//解码时间
uint8_t *data;int size;


//创建并初始化(只创建对象,不创建里面的内容)
AVPacket *av_packet_alloc(void);

//创建并克隆,增加引用计数
AVPacket * av_packet_clone(const AVPacket * src);

//增加引用计数
int av_packet_ref(AVPacket *dts,const AVPacket *src);

//减少引用计数
int av_packet_unref(AVPacket *pkt);

//清空对象并减引用计数
void av_packet_free(AVPacket **pkt);

//默认值
void av_init_packet(AVPacket *pkt);

//手动生成内存
int av_packet_from_data(AVPacket * pkt ,uint8_t *data int size);


av_seek_frame

int av_seek_frame(AVFormatContext *s,
                  int stream_index,//-1 default
                 int64_t timestamp,//AVStream.time_base
                 int flags//方法
                 )
/*
问题思考
stream_index 默认一般为视频,视频存在B帧,音频不存在,如果为音频,可能当时没有关键帧,解码的时候会出现错误

timestamp 传入的时间不是关键帧,需要判断前一帧,后一帧

flag
#define AVSEEK_FLAG_BACKWARD 1 ///< seek backward
#define AVSEEK_FLAG_BYTE     2 ///< seeking based on position in bytes
#define AVSEEK_FLAG_ANY      4 ///< seek to any frame, even non-keyframes
#define AVSEEK_FLAG_FRAME    8 ///< seeking based on frame number
*/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据引用和引用的内容,使用FFmpeg可以实现封装H.264和AAC音频。具体的步骤如下: 1. 准备FFmpeg:确保已经下载并安装最新版本的FFmpeg,并将其添加到系统的环境变量中。 2. 打开命令行终端:在命令行中输入以下命令以封装H.264和AAC音频: ``` ffmpeg -i input.mp4 -c:v copy -c:a copy output.h264 ffmpeg -i input.mp4 -vn -c:a copy output.aac ``` 其中,`input.mp4`是要封装的文件名,`output.h264`是输出的H.264视频文件名,`output.aac`是输出的AAC音频文件名。 3. 执行命令:按下Enter键执行命令,FFmpeg会开始封装过程。 4. 等待完成:等待命令行显示封装过程的进度,并等待封装过程完成。 5. 完成封装:完成后,你将得到一个H.264视频文件和一个AAC音频文件,用于进一步处理或播放。 需要注意的是,如果要模拟实时视频发送,需要安装FFmpeg并将其放置在可以连接到国标平台网络的位置。详细的安装步骤可以参考引用中提供的链接。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Hi3531D调试手记(四):使用ffmpeg实时封装H264视频为MP4](https://blog.csdn.net/qq_38940316/article/details/114577809)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [GB28181国标平台测试软件,模拟监控摄像头,实现了注册、注销、目录、INVITE,BYE、KEEPLIVE、OPTION信令](https://download.csdn.net/download/SE_JW/88241318)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值