FFmpeg小白学习记录(一)信息查看

FFmpeg

libavformat

用于各种音视频封装格式的生成和解析,包括获取解码所需信息以生成解码上下文结构和读取音视频帧等功能;音视频的格式解析协议,为 libavcodec 分析码流提供独立的音频或视频码流源

libavcodec

用于各种类型声音/图像编解码;该库是音视频编解码核心,实现了市面上可见的绝大部分解码器的功能,libavcodec 库被其他各大解码器 ffdshow,Mplayer 等所包含或应用

libavfilter

音视频滤镜库,该模块提供了包括音频特效和视频特效的处理,在使用FFmpeg的API进行编解码的过程中,直接使用该模块为音视频数据做特效处理是非常方便和高效的方式

libavutil

核心工具库,该模块是最基础的模块之一,许多其他模块都会依赖该库做一些基本的音视频处理操作

libswresample

该模块可用于音频重采样,可以对数字音频进行音声道、数据格式、采样率等多种进本信息的转换

libswscale

(原始视频格式转换)用于视频场景比例缩放、色彩映射转换;图像颜色空间或格式转换,如 rgb565,rgb888 等与 yuv420 等之间转换。

版本查看

int main(){
    unsigned codecVer = avcodec_version();
    int ver_major,ver_minor,ver_micro;
    ver_major = (codecVer>>16)&0xff;
    ver_minor = (codecVer>>8)&0xff;
    ver_micro = (codecVer)&0xff;
    printf("FFmpeg version is: %s .\navcodec version is: %d=%d.%d.%d.\n",FFMPEG_VERSION,codecVer,ver_major,ver_minor,ver_micro);

    return 0;
}

FFmpeg分为各个模块,每个模块的版本都不一致且与FFmpeg的主版本号没有关联,不过我们可以查看各个模块的版本号,如:avcodec,然后根据模块的版本号去官网查看对应的主版本号

version = [major:minor:micro]

每个各占8位

查看视频流信息

我们可以将多媒体文件看作是一个容器,其中存放着各种流(视频流、音频流、字幕流)

每种流都是由不同的编码器进行编码,比如视频流编码有h.264、MPEG4、H.265等,这些信息我们都可以通过FFmpegav_dump_format函数打印

示例代码

extern "C"{
#include"libavformat/avformat.h"
}

int main() {
    AVFormatContext* fmt_ctx = avformat_alloc_context();//创建对象并初始化
    int ret = 0;
    //文件地址
    const char* filePath = ".\\target.mp4";

    do {
        //打开文件
        if ((ret = avformat_open_input(&fmt_ctx, filePath, NULL, NULL)) < 0)
            break;//Cannot open video file

        //查找流信息(音频流和视频流)
        if ((ret = avformat_find_stream_info(fmt_ctx, NULL)) < 0) {
            printf("Cannot find stream information\n");
            break;
        }

        av_dump_format(fmt_ctx, 0, filePath, 0);//输出视频信息
    } while (0);

    avformat_close_input(&fmt_ctx);//关闭文件

    return 0;
}

输出结果:

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'target.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf58.48.100
  Duration: 00:03:10.36, start: 0.000000, bitrate: 773 kb/s
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709), 1280x720, 442 kb/s, 25 fps, 25 tbr, 90k tbn, 50 tbc (default)
    Metadata:
      handler_name    : VideoHandler
    Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 325 kb/s (default)
    Metadata:
      handler_name    : SoundHandler

文件使用完成之后要及时关闭。可以使用goto语句进行错误处理,但是在开发C++时不推荐使用goto语句

可以使用do{}while(0),实现类似效果,此语句只会执行{}中的代码一次,将释放资源的代码放在do-while代码段之外,出现异常就进行break即可

代码解析

结构体

avformat_alloc_context用于创建AVFormatContext结构体的方法,AVFormatContext是结构上下文,内部存放着描述媒体文件或媒体流的构成和基本信息,贯穿ffmpeg使用整个流程

// 截取出部分较为重要的数据
typedef struct AVFormatContext {
    struct AVInputFormat *iformat;
    struct AVOutputFormat *oformat;//输入或者输出流的格式(只能存在一个)
    
    AVIOContext *pb;//管理输入输出数据
        
    unsigned int nb_streams;//音视频流的个数
    AVStream **streams;//音视频流       
    
    char *url;//文件名
    int64_t duration;//时长
    int bit_rate;//比特率(单位bite/s)
    
    AVDictionary *metadata;//元数据(查看元数据:ffprobe filename)
    ...
}

其中存放着AVStream结构体,存储音频流或视频流

// 截取出部分较为重要的数据
typedef struct AVStream {
    int index;//音频流或视频流的索引
    AVRational time_base;//计算pts或dts是使用的时间戳基本单位(显示时间:pt = av_q2d(video_stream->time_base) * frame->pts)
    int64_t duration;//该视频||音频流长度
    AVRational avg_frame_rate;//平均帧率(对于视频来说,frame_rate=avg_frame_rate.num / avg_frame_rate.den)
    AVCodecParameters *codecpar;//解码器参数
    ...
} AVStream;
函数

avformat_open_input函数用于打开一个多媒体文件,可以是本地文件也可以是网络文件

int avformat_open_input(AVFormatContext **ps, const char *url, AVInputFormat *fmt, AVDictionary **options);

参数:

  • AVFormatContext **ps:AVFormatContext结构体,注意此处为指针的指针,也就是在该方法中为AVFormatContext数据赋值
  • const char *url:文件路径
  • AVInputFormat *fmt:输入格式,若为NULL,则会通过 url 文件后缀去寻找对应格式
  • AVDictionary **options:指定各种参数,比如:探测时间、超时时间、最大延时、支持的协议的白名单等等,一般填NULL即可

return:

返回0则代表成功,失败则会返回一个负数

与之对应的就是avformat_close_input,该函数会去释放AVFormatContext所持有的资源


avformat_find_stream_info函数用于查找流信息(音频流和视频流)

int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options);

参数:

  • AVFormatContext *ic:AVFormatContext结构体
  • AVDictionary **options:与上述方法作用一致,基本都是填NULL

return:

返回数值 ≥ 0时代表成功,其余则代表失败


av_dump_format函数会打印多媒体文件中的Meta信息,如:时长、比特率、编解码器等

void av_dump_format(AVFormatContext *ic,
                    int index,
                    const char *url,
                    int is_output);

参数:

  • AVFormatContext *ic:AVFormatContext结构体
  • int index:要转储信息的流的索引,只是打印没什么影响
  • const char *url:url只是打印结果的显示,所以输入什么不影响
  • int is_output:指定上下文是输入(0)还是输出(1)

注意:有的流需要经过avformat_find_stream_info才能打印出信息,有些流则不需要

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,607评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,047评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,496评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,405评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,400评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,479评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,883评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,535评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,743评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,544评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,612评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,309评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,881评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,891评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,136评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,783评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,316评论 2 342

推荐阅读更多精彩内容

  • @TOC 常用结构体 FFMPEG中结构体很多。最关键的结构体可以分成以下几类: 解协议(http,rtsp,rt...
    孔雨露阅读 554评论 0 1
  • ffmpeg是一个非常有用的命令行程序,它可以用来转码媒体文件。它是领先的多媒体框架FFmpeg的一部分,其有很多...
    城市之光阅读 6,719评论 3 6
  • 一、简介 官方文档资料:http://ffmpeg.org/documentation.htmlFFmpeg官方w...
    阿凡提说AI阅读 6,851评论 0 17
  • 本文转自:FFmpeg 入门(1):截取视频帧 | www.samirchen.com 背景 在 Mac OS 上...
    SamirChen阅读 9,420评论 6 15
  • 浅谈iOS视频开发 这段时间对视频开发进行了一些了解,在这里和大家分享一下我自己觉得学习步骤和资料,希望对那些对视...
    紫烛雨寒阅读 1,141评论 0 2