[音視頻開發(fā)]FFmpeg基本使用及實戰(zhàn)操作

音視頻應用場景:

  • 直播類:音視頻會議侵俗、教育直播、娛樂/游戲直播等
  • 短時頻:抖音丰刊、快手隘谣、小咖秀
  • 網(wǎng)絡視頻:優(yōu)酷、騰訊視頻啄巧、愛奇藝
  • 音視頻通話:微信寻歧、QQ、Skype等
  • 視頻監(jiān)控
  • 人工智能:人臉識別秩仆、智能音箱等码泛,更關注算法。

一. FFmpeg日志

3個步驟:

  • 包含include <libavutil/log.h>
  • 設置打印級別:av_log_set_level(AV_LOG_DEBUG)
  • 打印函數(shù):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環(huán)境變量的設置

pkg-config 命令可以到 PKG_CONFIG_PATH 指定的路徑下找指定庫的 .pc 文件噪珊,然后從.pc 文件中拿到需要的庫路徑,名稱以及頭文件齐莲。比如執(zhí)行:

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

相當于執(zhí)行:

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

可以通過 pkg-config 找到需要的庫路徑和頭文件痢站,也可以單獨執(zhí)行查看是否有該 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環(huán)境變量:

#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

保存退出再執(zhí)行以下命令讓設置立即生效:

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文件代碼如下:

三. 操作目錄的函數(shù)

核心函數(shù):

avio_open_dir() 
avio_read_dir()
avio_close_dir()

相關類:

  • AVIODirContext:操作目錄的上下文
  • AVIODirEntry:目錄項选酗,用于存放文件名阵难、文件大小等信息

實戰(zhàn):實現(xiàn)一個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位操作系統(tǒng)。PRld64表示64位整數(shù)殿衰,在32位系統(tǒng)中表示long long int怀偷,在64位系統(tǒng)中表示long int:

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

2. 編譯
clang -g -o list ffmpeg_list.c `pkg-config --libs libavformat libavutil`

四. 處理數(shù)據(jù)流的基本概念

1. 多媒體文件的基本概念
  • 多媒體文件其實是個容器。
  • 在容器里有很多流(Stream/Track)播玖。
  • 每種流是由不同的編碼器編碼的椎工,比如音頻mp3,視頻H264蜀踏、H265等等维蒙。
  • 從流中讀出的數(shù)據(jù)稱為包。
  • 在一個包中包含著一個或多個幀果覆。
2. 幾個重要的結構體
  • AVFormatContext:格式上下文颅痊,連接api間的橋梁,多媒體文件的信息會存在這個結構體中局待,用來在調用不同api時辨別是哪個多媒體文件斑响。
  • AVStream:通過此結構體可以讀取流菱属。
  • AVPacket:通過它獲取數(shù)據(jù)包。
3. FFmpeg 操作流數(shù)據(jù)的基本步驟

總結:多媒體文件是個容器舰罚,里面包含了許多流纽门,如音頻、視頻营罢、字幕等等赏陵,通過解復用獲取流,流中讀取出數(shù)據(jù)包饲漾,數(shù)據(jù)包中存著一個或多個被壓縮的數(shù)據(jù)幀蝙搔。

五. FFmpeg實戰(zhàn)

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市考传,隨后出現(xiàn)的幾起案子吃型,更是在濱河造成了極大的恐慌,老刑警劉巖僚楞,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件败玉,死亡現(xiàn)場離奇詭異,居然都是意外死亡镜硕,警方通過查閱死者的電腦和手機运翼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來兴枯,“玉大人血淌,你說我怎么就攤上這事〔破剩” “怎么了悠夯?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長躺坟。 經(jīng)常有香客問我沦补,道長,這世上最難降的妖魔是什么咪橙? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任夕膀,我火速辦了婚禮,結果婚禮上美侦,老公的妹妹穿的比我還像新娘产舞。我一直安慰自己,他們只是感情好菠剩,可當我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布易猫。 她就那樣靜靜地躺著,像睡著了一般具壮。 火紅的嫁衣襯著肌膚如雪准颓。 梳的紋絲不亂的頭發(fā)上哈蝇,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天,我揣著相機與錄音攘已,去河邊找鬼炮赦。 笑死,一個胖子當著我的面吹牛贯被,可吹牛的內容都是我干的。 我是一名探鬼主播妆艘,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼彤灶,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了批旺?” 一聲冷哼從身側響起幌陕,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎汽煮,沒想到半個月后搏熄,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡暇赤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年心例,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鞋囊。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出驮审,到底是詐尸還是另有隱情棉钧,我是刑警寧澤,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布挺益,位于F島的核電站歉糜,受9級特大地震影響,放射性物質發(fā)生泄漏望众。R本人自食惡果不足惜匪补,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望烂翰。 院中可真熱鬧叉袍,春花似錦、人聲如沸刽酱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽棵里。三九已至润文,卻和暖如春姐呐,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背典蝌。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工曙砂, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人骏掀。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓鸠澈,卻偏偏與公主長得像,于是被迫代替她去往敵國和親截驮。 傳聞我的和親對象是個殘疾皇子笑陈,可洞房花燭夜當晚...
    茶點故事閱讀 45,435評論 2 359

推薦閱讀更多精彩內容