ffmpeg在iOS的使用-iFrameExtractor原始碼解析

發表於2015-09-15

iFrameExtractor地址:https://github.com/lajos/iFrameExtractor

ffmpeg的簡介

FFmpeg是一套可以用來記錄、轉換數字音訊、視訊,並能將其轉化為流的開源計算機程式。

“FFmpeg”這個單詞中的”FF”指的是”Fast Forward”。

ffmpeg支援的格式

ASF

AVI

BFI

FLV

GXF, General eXchange Format, SMPTE 360M

IFF

RL2

ISO base media file format(包括QuickTime, 3GP和MP4)

Matroska(包括WebM)

Maxis XA

MPEG program stream

MPEG transport stream(including AVCHD)

MXF, Material eXchange Format, SMPTE 377M

MSN Webcam stream

Ogg

OMA

TXD

WTV

ffmpeg支援的協議

IETF標準:TCP, UDP, Gopher, HTTP, RTP, RTSP和SDP

蘋果公司的相關標準:HTTP Live Streaming

RealMedia的相關標準:RealMedia RTSP/RDT

Adobe的相關標準:RTMP, RTMPT(由librtmp實現),RTMPE(由librtmp實現),RTMPTE(由librtmp)和RTMPS(由librtmp實現)

微軟的相關標準:MMS在TCP上和MMS在HTTP上

iFrameExtractor的使用

初始化

播放

VideoFrameExtractor類解析

initWithVideo:(NSString *)moviePath方法

VideoFrameExtractor的初始化,主要是配置三個全域性的結構體變數。

AVFormatContext型別的pFormatCtx,AVFormatContext主要儲存視音訊封裝格式中包含的資訊;AVInputFormat儲存輸入視音訊使用的封裝格式。每種視音訊封裝格式都對應一個AVInputFormat 結構。

AVCodecContext型別的pCodecCtx ,每個AVStream儲存一個視訊/音訊流的相關資料;每個AVStream對應一個AVCodecContext,儲存該視訊/音訊流使用解碼方式的相關資料;每個AVCodecContext中對應一個AVCodec,包含該視訊/音訊對應的解碼器。每種解碼器都對應一個AVCodec結構。

AVFrame型別的pFrame,視訊的話,每個結構一般是存一幀,音訊可能有好幾幀。解碼前資料是AVPacket,解碼後資料是AVFrame。

FMPEG中結構體很多。最關鍵的結構體他們之間的對應關係如下所示:

 

圖片來自:FFMPEG中最關鍵的結構體之間的關係

下面就是初始化的程式碼

sourceWidth和sourceHeight方法

獲取螢幕的寬和高

setupScaler方法

設定視訊播放檢視的尺寸

duration方法

獲取音視訊檔案的總時間

currentTime方法

顯示音視訊當前播放的時間

seekTime:(double)seconds方法

直接跳到音視訊的第seconds秒進行播放,預設從第0.0秒開始

stepFrame方法

解碼視訊得到幀

currentImage方法

獲取當前的UIImage物件,以呈現當前播放的畫面

convertFrameToRGB

轉換音視訊幀到RGB

(UIImage *)imageFromAVPicture:(AVPicture)pict width:(int)width height:(int)height方法

把AVPicture轉換成UIImage把音視訊畫面顯示出來

Reference

ElevenPlayer: 這是我用ffmpeg寫的iOS萬能播放器。

iOS配置FFmpeg框架

FFmpeg-wikipedia

Vitamio測試網路視訊地址

FFMPEG結構體分析-系列文章:包括AVFrame、AVFormatContext、AVCodecContext、AVIOContext、AVCodec、AVStream、AVPacket

FFmpeg開發和使用有關的文章的彙總

ffmpeg 官網

FFmpeg GitHub source code

 

相關文章