天天看點

【從零沖擊音視訊開發】FFmpeg的介紹和基本使用

作者:音視訊流媒體技術

前言

這篇文章寫了有一會兒了,但是我手頭作業要寫不完了,下周三之前估計最多也就更新一下我的面經了,因為今天晚上還要抖音的三面,阿裡的下周一估計也要到hr面了。周六周天的時間,我的計組和電路學作業都還沒開動,再不學我就要涼了,時間真的太緊了,見諒見諒。

文章内容參考書目《音視訊開發進階指南 -- 基于 Android 與 iOS 平台的實踐》

目錄

【1】【從零沖擊音視訊開發】音視訊開發必備知識基礎

【2】【從零沖擊音視訊開發】移動環境搭建

【3】【從零沖擊音視訊開發】FFmpeg的介紹和基本使用

FFmpeg的環境搭建

材料清單:
1. 10.15.2的OSX系統
2. HomeBrew(安裝姿勢:/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)")
3. ffmpeg的依賴(安裝姿勢: brew install ffmpeg;檔案路徑: /usr/local/Cellar)
4. ffmpeg-4.2.2的源碼(官網下)
5. NDK-r20           
【從零沖擊音視訊開發】FFmpeg的介紹和基本使用

這是一個用于本地使用的環境,裡面放置有不少的樣例,但是不建議使用在開發。

我使用過了很多次,.a的靜态庫在XCode上能直接玩,在AS上就直接整不起來。是以這裡要推一個交叉編譯詳解的文章。

  • 如果你是勤勞的讀者,要自己交叉編譯,過程詳見于【Android 音視訊開發打怪更新:FFmpeg音視訊編解碼篇】一、FFmpeg so庫編譯
  • 如果你是想“快速”開發的讀者,可以直接“偷”我的。

相關學習資料推薦,點選下方連結免費報名,先碼住不迷路~】

【免費分享】音視訊學習資料包、大廠面試題、技術視訊和學習路線圖,資料包括(C/C++,Linux,FFmpeg webRTC rtmp hls rtsp ffplay srs 等等)有需要的可以點選加群免費領取~

【從零沖擊音視訊開發】FFmpeg的介紹和基本使用

FFmpeg子產品介紹

bin

【從零沖擊音視訊開發】FFmpeg的介紹和基本使用

指令行工具所在的位置,ffplay、ffmpeg、ffprobe等等。

// ffprobe各種指令
> ffprobe 檔案 // 顯示檔案頭資訊
> ffprobe -show_format 檔案 // 顯示輸出格式、時間長度、檔案大小、比特率等資訊
> ffprobe -pirnt_format json -show_streams 檔案 // 以json格式輸出具體每一個流的資訊
> ffprobe -show_frames 檔案 // 顯示幀資訊
> ffprobe -show_packets 檔案 // 顯示包資訊
//。。。。。

// ffplay
> ffplay 檔案 // 播放
> ffplay 檔案 -loop 10 // 循環播放10次
> ffplay 檔案 -ast 0 // 播放第0路音頻流,其他路沒有流的話會靜音
> ffplay 檔案 -vst 0 // 播放第0路視訊流,其他路沒有流的話會黑屏
> ffplay 檔案.pcm -f s16le -channels 2 -ar 44100 // 播放pcm格式檔案的方式,需要設定格式(-f),聲道數(-channels),采樣率(-ar)
> ffplay -f rawvideo -pixel_format yuv420p -s 480*480 檔案.yuv(檔案.rgb) // 檢視一幀的視訊幀(這個沒有調試通過)
> ffplay 檔案 -sync audio // 以音頻為基準進行音視訊同步(預設方案)
> ffplay 檔案 -sync video // 以視訊為基準進行音視訊同步
> ffplay 檔案 -sync ext // 以外部時鐘為基準進行音視訊同步
> ffplay 檔案 -ss 50 // 跳過50s的内容
//。。。。。

// ffmpeg
// 會有很多的通過參數以圖檔給出,具體使用後期會慢慢看到,就不再示範           
【從零沖擊音視訊開發】FFmpeg的介紹和基本使用
【從零沖擊音視訊開發】FFmpeg的介紹和基本使用
【從零沖擊音視訊開發】FFmpeg的介紹和基本使用

inlcude -> 8大子產品

【從零沖擊音視訊開發】FFmpeg的介紹和基本使用

存放的是已經編譯結束的靜态庫檔案的頭檔案

AVCodec: 用于編碼解碼

AVDevice: 輸入輸出裝置

AVFilter: 音視訊濾鏡庫,提供音視訊特效的處理。

AVFormat: 檔案格式和協定庫。封裝了Protocol層和Demuxer、Muxer層。

AVResample: 用于音頻重采樣 (書上說老版本才會編譯出來,已經廢棄,但是我的版本是最新的,有待考察)

AVUtil: 核心工具

PostProc: 用于後期處理,是使用AVFilter時要開啟的子產品。

SwResample: 用于音頻重采樣,對音頻進行聲道數、資料格式、采樣率等基本資訊轉化。

SWScale: 将圖像進行格式轉換,比如YUV -> RGB

lib

【從零沖擊音視訊開發】FFmpeg的介紹和基本使用

存放的是已經編譯完成的靜态庫檔案,在連結階段會使用到。

share

【從零沖擊音視訊開發】FFmpeg的介紹和基本使用

其實就是一個example的位置,用于講解FFmpeg各個工具的使用方法,還有使用樣例等等。

【從零沖擊音視訊開發】FFmpeg的介紹和基本使用

FFmpeg的使用

前面講了很多東西,但是我們真正要在Java代碼中如何進行使用卻完全還沒有進行過,是以這裡就要進行的是Java代碼中的測試了。

第一步:導包和引用

【從零沖擊音視訊開發】FFmpeg的介紹和基本使用

然後CMakeList.txt中導入我們需要加載的so。

cmake_minimum_required(VERSION 3.4.1)

# 定義變量
set(ffmpeg_lib_dir ${CMAKE_SOURCE_DIR}/../jniLibs/${ANDROID_ABI})
set(ffmpeg_head_dir ${CMAKE_SOURCE_DIR}/ffmpeg)

add_library( # Sets the name of the library.
        audioencoder
        SHARED
        # lame
        lame/bitstream.c lame/encoder.c lame/gain_analysis.c
        lame/lame.c lame/id3tag.c lame/mpglib_interface.c
        lame/newmdct.c lame/presets.c lame/psymodel.c
        lame/quantize.c lame/fft.c lame/quantize_pvt.c
        lame/reservoir.c lame/set_get.c lame/tables.c
        lame/takehiro.c lame/util.c lame/vbrquantize.c
        lame/VbrTag.c lame/version.c
        # mine
        audioencoder/audioencoder.cpp
        audioencoder/mp3_encoder.cpp)

# 添加ffmpeg相關的so庫
add_library( avutil
        SHARED
        IMPORTED )
set_target_properties( avutil
        PROPERTIES IMPORTED_LOCATION
        ${ffmpeg_lib_dir}/libavutil.so )

add_library( swresample
        SHARED
        IMPORTED )
set_target_properties( swresample
        PROPERTIES IMPORTED_LOCATION
        ${ffmpeg_lib_dir}/libswresample.so )

add_library( avcodec
        SHARED
        IMPORTED )
set_target_properties( avcodec
        PROPERTIES IMPORTED_LOCATION
        ${ffmpeg_lib_dir}/libavcodec.so )

add_library( avfilter
        SHARED
        IMPORTED)
set_target_properties( avfilter
        PROPERTIES IMPORTED_LOCATION
        ${ffmpeg_lib_dir}/libavfilter.so )

add_library( swscale
        SHARED
        IMPORTED)
set_target_properties( swscale
        PROPERTIES IMPORTED_LOCATION
        ${ffmpeg_lib_dir}/libswscale.so )

add_library( avformat
        SHARED
        IMPORTED)
set_target_properties( avformat
        PROPERTIES IMPORTED_LOCATION
        ${ffmpeg_lib_dir}/libavformat.so )

add_library( avdevice
        SHARED
        IMPORTED)
set_target_properties( avdevice
        PROPERTIES IMPORTED_LOCATION
        ${ffmpeg_lib_dir}/libavdevice.so )


find_library( # Sets the name of the path variable.
        log-lib
        log)

# 引入頭檔案
include_directories(${ffmpeg_head_dir}/include)

target_link_libraries( # Specifies the target library.
        audioencoder
        # ffmpeg
        avutil
        swresample
        avcodec
        avfilter
        swscale
        avformat
        avdevice

        ${log-lib})           

第二步:使用

當然使用方案上來說還是一樣的,但是這裡我們存在需要注意的地方,因為FFmpeg是由C編寫而成的,而我們去編譯的卻是使用的C++,是以套上一層extern "C"是必須要做的事情。

【從零沖擊音視訊開發】FFmpeg的介紹和基本使用

這裡的源碼直接抄的貓哥的,做一個示範。

【從零沖擊音視訊開發】FFmpeg的介紹和基本使用

在Github中帶了一個用FFmpeg去解碼mp3->pcm的樣例,當然裡面有很多功能感覺也沒用到吧,主要做了一個解釋,詳細看關注點,當然我也在源碼中提了一些問題,你要是知道怎麼解決,或者有什麼新的問題,發評論啊、發郵件之類的,我會繼續探索的。

之後了解的差不多了就會自己再開一個項目動手開發的,希望這個學習項目你們也能star,嘿嘿嘿。

【從零沖擊音視訊開發】FFmpeg的介紹和基本使用

以上就是我的學習成果,如果有什麼我沒有思考到的地方或是文章記憶體在錯誤,歡迎與我分享。

原文 【從零沖擊音視訊開發】FFmpeg的介紹和基本使用 - 掘金

繼續閱讀