利用ffmpeg解析视频文件信息

本文详细介绍了如何利用ffmpeg库解析不同类型的视频文件,如MP4、mkv、TS、rmvb、AVI和flv。通过avformat_open_input()初始化AVFormatContext,avcodec_alloc_context3()初始化AVCodecContext。内容涉及codec ID、profile的获取,以及av_log()函数在日志输出中的作用。代码测试结果显示,ffmpeg提供的信息比VLC更丰富,推荐使用potplayer进行更详细的解析。
摘要由CSDN通过智能技术生成

解析文件的信息主要从AVFormatContext fmt_ctx,*AVCodecContext *codec_ctx,这两个结构体中获取,fmt_ctx 初始化的函数avformat_open_input(),codec_ctx的初始化函数avcodec_alloc_context3()
下面列举一些代码里用到的结构体成员

typedef struct AVFormatContext {
    struct AVInputFormat *iformat;//输入数据的封装格式
    unsigned int nb_streams;//视音频流的个数
    AVStream **streams;//视音频流
    char filename[1024];//文件名
    int64_t duration//时长(单位:微秒us,转换为秒需要除以1000000)
    int bit_rate//比特率(单位bps,转换为kbps需要除以1000)
    AVDictionary *metadata//元数据
    int64_t start_time;//开始的时间
    ......
    }
typedef struct AVCodecContext {

    enum AVMediaType codec_type;//编解码器的类型(视频,音频...)
    struct AVCodec  *codec;//采用的解码器AVCodec(H.264,MPEG2...)
    int bit_rate;//平均比特率
    uint8_t *extradata;//针对特定编码器包含的附加信息(例如对于H.264解码器来说,存储sps,pps等)                        
    AVRational time_base;//根据该参数,可以把PTS转化为实际的时间(单位为秒s)
    int width, height;//如果是视频的话,代表宽和高
    int refs;//运动估计参考帧的个数(H.264的话会有多帧,MPEG2这类的一般就没有了)
    int sample_rate;//采样率(音频)
    int channels;//声道数(音频)
    enum AVSampleFormat sample_fmt;//采样格式
    int profile;//型(H.264里面就有,其他编码标准应该也有)
    int level;//级(和profile差不太多)
    .......
    }

关于codec, 在libavcodec/avcode.h中定义了codec的ID

enum AVCodecID {
 /* video codecs */
    AV_CODEC_ID_MPEG1VIDEO,
    AV_CODEC_ID_MPEG2VIDEO, ///< preferred ID for MPEG-1/2 video decoding
    AV_CODEC_ID_MPEG2VIDEO_XVMC,
    AV_CODEC_ID_H261,
    AV_CODEC_ID_H263,
    AV_CODEC_ID_RV10,
    AV_CODEC_ID_RV20,
    AV_CODEC_ID_MJPEG,
    AV_CODEC_ID_MJPEGB,
    ....
    /* audio codecs */
    AV_CODEC_ID_MP2 = 0x15000,
    AV_CODEC_ID_MP3, ///< preferred ID for decoding MPEG audio layer 1, 2 or 3
    AV_CODEC_ID_AAC,
    AV_CODEC_ID_AC3,
    AV_CODEC_ID_DTS,
    ....
}

可以根据codecID来找出codec的名字,利用const char *avcodec_get_name(enum AVCodecID id)
这个函数。
关于profile,在libavcodec/avcode.h中通过宏定义来定义了音频和视频的不同profile,通过函数const char *avcodec_profile_name(enum AVCodecID codec_id, int profile)可以获取音视频的profile。

#define FF_PROFILE_UNKNOWN -99
#define FF_PROFILE_RESERVED -100
#define FF_PROFILE_AAC_MAIN 0
#define FF_PROFILE_AAC_LOW  1
#define FF_PROFILE_AAC_SSR  2
#define FF_PROFILE_AAC_LTP  3
#define FF_PROFILE_MPEG2_422    0
#define FF_PROFILE_MPEG2_HIGH   1
#define FF_PROFILE_MPEG2_SS     2
#define FF_PROFILE_MPEG2_SNR_SCALABLE  3
#define FF_PROFILE_MPEG2_MAIN   4
#define</
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值