AVFormatContext 简单初试

AVFormatContext

封装格式上下文结构体,统领全局的结构体,保存音视频文件封装格式相关信息。

结构体常用成员:

ff_const59 struct AVInputFormat *iformat;// 输入数据的格式
ff_const59 struct AVOutputFormat *oformat;// 输出数据格式
AVIOContext *pb;// I / O上下文
unsigned int nb_streams;//文件媒体流的数量,只能由avformat_new_stream()设置
AVStream **streams;// 文件中所有流的列表
char filename[1024];// 输入或输出文件名
start_time、duration、bit_rate//  第一帧开始时间、总时长、码率
AVDictionary *metadata;// 元数据

AVformatContext简单示例:

#include <stdio.h>
#include <libavformat/avformat.h>

int main(int argc, char **argv)
{
	const char *in_filename = "xxx.mp4";
	
    //AVFormatContext是描述一个媒体文件或媒体流的构成和基本信息的结构体
    AVFormatContext *ifmt_ctx = NULL;           // 输入文件的demux

    // 打开文件,探测协议类型,创建url
    int ret = avformat_open_input(&ifmt_ctx, in_filename, NULL, NULL);
    
    //获取流信息
    ret = avformat_find_stream_info(ifmt_ctx, NULL);

    //打开媒体文件成功
    printf_s("\n==== av_dump_format in_filename:%s ===\n", in_filename);
    av_dump_format(ifmt_ctx, 0, in_filename, 0);//输出文件格式,媒体文件信息
    printf_s("\n==== av_dump_format finish =======\n\n");
    // url: 调用avformat_open_input读取到的媒体文件的路径/名字
    printf("media name:%s\n", ifmt_ctx->url);
    // nb_streams: nb_streams媒体流数量
    printf("stream number:%d\n", ifmt_ctx->nb_streams);
    // bit_rate: 媒体文件的码率,单位为bps   /1024转为kbps
    printf("media average ratio:%lldkbps\n",(int64_t)(ifmt_ctx->bit_rate/1024));
    // 时间
    int total_seconds, hour, minute, second;
    // duration: 媒体文件时长,单位微妙
    //ffmpeg中的内部计时单位(时间戳),AVStream中的duration以这个流的长度为duration个AV_TIME_BASE 
    total_seconds = (ifmt_ctx->duration) / AV_TIME_BASE;  // 1000us = 1ms, 1000ms = 1秒  得到多少秒时长
    hour = total_seconds / 3600;
    minute = (total_seconds % 3600) / 60;
    second = (total_seconds % 60);
    //媒体文件的总时长(经过时分秒转化)
    printf("total duration: %02d:%02d:%02d\n", hour, minute, second);
    printf("\n");
    getchar(); 
    return 0;
}


  • 7
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值