如何快速掌握libav(ffmpeg)入门教程(一)?

摘要:突然发现又有好久没有写技术blog了,主要原因是最近时间都用来研究libav去了(因为api极类似ffmpeg,虽然出自同一份代码的另外一个分支,因项目选用libav,故下文均用libav代替),其实要从知道这个库的时候已经很久了,早在加入
突然发现又有好久没有写技术blog了,主要原因是最近时间都用来研究libav去了(因为api极类似ffmpeg,虽然出自同一份代码的另外一个分支,因项目选用libav,故下文均用libav代替),其实要从知道这个库的时候已经很久了,早在加入avplayer开源社区的已经略有耳闻,看着他们讨论我却一直不知这个库能具体帮我做到哪些功能,插不上嘴呢,更强迫了我学习它的热情,下面就来一一解惑,希望就能帮到类似几个月前的我那样的同行。 1、提供API解码、编码市面上主流几乎全部的视频、音频格式文件。 2、通用视频转换命令行工具ffmpeg、avconv,可以帮我们快速将媒体文件格式进行转换,且做一些简单的resize或者resample,其工具提供了非常强大的filter,各种变幻根据参数都能实现,没有你想不到的,只有你找不到的。 3、简单的播放器avplay命令,这个播放器支持libav所有能够支持的video codec,算个简单的万能播放器了,虽然seek功能弱爆了,并且还没有pause、stop、显示时间等等功能,不过有些应急时候绝对首选它了。 4、libav还提供avprobe命令,可以让你瞬间了解这个媒体文件其中真实的video/audio编码(不会受到文件扩展名的误导)、拥有哪些stream(一般MP4分为视频、音频、字幕),一目了然。 读到此你一定会很感激我,不像大多数技术博客那样直接贴上很多大段大段的代码一下吓走好多初学者....我不能保证接下来一定不贴代码上来,但是我会尽量克制自己的.... 本文主要将以第1点API解码编码的介绍为主。因为libav是基于C实现的,调用习惯全是基于函数式的,这样的优点就是跨平台好吧,缺点就是会使client代码比较臃肿,到处充斥着free、alloc等等。如果你是一个纯面向对象发烧支持者,请不要往下看,以免伤身且药还不能停。 libav提供一个函数avformat_open_input,即打开一个媒体文件,用AVFormatContext指针接受返回结果,代码看起来就是这样: AVFormatContext* pformat_context = avformat_alloc_context(); if(avformat_open_input(&pformat_context, file.c_str(), nullptr, 0) != 0) { printf("can't open the file %s\n", file.c_str()); return false; } 然后你要做的是将所打开的FormatContext读取其中的stream,其中会有各种各样的stream类型,你需要做的事情就是将这个stream的index记录下来。
阅读全文