[音视频开发]FFmpeg基本使用及实战操作

音视频应用场景:

  • 直播类:音视频会议、教育直播、娱乐/游戏直播等
  • 短时频:抖音、快手、小咖秀
  • 网络视频:优酷、腾讯视频、爱奇艺
  • 音视频通话:微信、QQ、Skype等
  • 视频监控
  • 人工智能:人脸识别、智能音箱等,更关注算法。

一. FFmpeg日志

3个步骤:

  • 包含include <libavutil/log.h>
  • 设置打印级别:av_log_set_level(AV_LOG_DEBUG)
  • 打印函数:av_log(NULL, AV_LOG_INFO, "...%s\n", p)

常用日志级别由高到低:

  • AV_LOG_ERROR
  • AV_LOG_WARNING
  • AV_LOG_INFO
  • AV_LOG_DEBUG

实例展示,建一个ffmpeg_log.c文件

#include<stdio.h>
#include<libavutil/log.h>
int main(int argc, char* argv[]){
    av_log_set_level(AV_LOG_DEBUG);
    av_log(NULL, AV_LOG_INFO, "Hello world: %s!\n", "shenfeng");
    return 0;
}

编译该c文件:

clang -g -o ffmpeg_log ffmpeg_log.c -lavutil

运行:

./ffmpeg_log

PKG_CONFIG_PATH环境变量的设置

pkg-config 命令可以到 PKG_CONFIG_PATH 指定的路径下找指定库的 .pc 文件,然后从.pc 文件中拿到需要的库路径,名称以及头文件。比如执行:

 clang -g -o test test.c `pkg-config --cflags --libs libavformat`

相当于执行:

clang -g -o ffmpeg_del ffmpeg_file.c -I/usr/local/ffmpeg/include  -L/usr/local/ffmpeg/lib -lavformat

可以通过 pkg-config 找到需要的库路径和头文件,也可以单独执行查看是否有该 pkg-config 的配置,没有的话找不到相应头文件:

pkg-config --libs libavutil
Package libavutil was not found in the pkg-config search path.
Perhaps you should add the directory containing `libavutil.pc'
to the PKG_CONFIG_PATH environment variable
No package 'libavutil' found

需要配置PKG_CONFIG_PATH环境变量:

#ffmpeg
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/ffmpeg/lib/pkgconfig

#libssl
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/opt/openssl/lib/pkgconfig

保存退出再执行以下命令让设置立即生效:

source ~/.bash_profile

二. 文件的删除与重命名

1. 删除
avpriv_io_delete()

编译语句:

clang -g -o ffmpeg_del ffmpeg_file.c `pkg-config --libs libavformat`

ffmpeg_file.c文件代码如下:

2. 重命名
avpriv_io_move()

编译语句:

clang -g -o ffmpeg_del ffmpeg_file.c `pkg-config --libs libavformat`

ffmpeg_file.c文件代码如下:

三. 操作目录的函数

核心函数:

avio_open_dir() 
avio_read_dir()
avio_close_dir()

相关类:

  • AVIODirContext:操作目录的上下文
  • AVIODirEntry:目录项,用于存放文件名、文件大小等信息

实战:实现一个ls命令。

1. 新建一个ffmpeg_list.c文件
#include <libavutil/log.h>
#include <libavformat/avformat.h>

int main (int argc, char* argv[]) {
  int res;

  AVIODirContext *ctx = NULL;
  AVIODirEntry *entry = NULL;
  av_log_set_level(AV_LOG_INFO);

  res = avio_open_dir(&ctx, "./", NULL);
  if (res < 0) {
    av_log(NULL, AV_LOG_ERROR, "Can't open dir:%s\n", av_err2str(res));
    goto __fail;
  }

  while (1) {
    res = avio_read_dir(ctx, &entry);
    if (res < 0) {
      av_log(NULL, AV_LOG_ERROR, "Can't read dir: %s\n", av_err2str(res));
      goto __fail;
    }
    if (!entry) {
      break;
    }

    av_log(NULL, AV_LOG_INFO, "%12"PRId64" %s \n", entry -> size, entry -> name);
    avio_free_directory_entry(&entry);
  }
__fail:
  avio_close_dir(&ctx);

  return 0;
}

其中,PRld:是一种跨平台的书写方式,主要是为了通知支持32位和64位操作系统。PRld64表示64位整数,在32位系统中表示long long int,在64位系统中表示long int:

printf("%" "ld" "\n", value); 
printf("%" "lld" "\n", value); 

2. 编译
clang -g -o list ffmpeg_list.c `pkg-config --libs libavformat libavutil`

四. 处理数据流的基本概念

1. 多媒体文件的基本概念
  • 多媒体文件其实是个容器。
  • 在容器里有很多流(Stream/Track)。
  • 每种流是由不同的编码器编码的,比如音频mp3,视频H264、H265等等。
  • 从流中读出的数据称为包。
  • 在一个包中包含着一个或多个帧。
2. 几个重要的结构体
  • AVFormatContext:格式上下文,连接api间的桥梁,多媒体文件的信息会存在这个结构体中,用来在调用不同api时辨别是哪个多媒体文件。
  • AVStream:通过此结构体可以读取流。
  • AVPacket:通过它获取数据包。
3. FFmpeg 操作流数据的基本步骤

总结:多媒体文件是个容器,里面包含了许多流,如音频、视频、字幕等等,通过解复用获取流,流中读取出数据包,数据包中存着一个或多个被压缩的数据帧。

五. FFmpeg实战

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

推荐阅读更多精彩内容