?
簡要介紹
FFmpeg 介紹
- 音視頻多媒體處理開源框架,采用LGPL或GPL許可證吞鸭。
- 有音視頻采集寺董、編碼、解碼瞒大、轉(zhuǎn)碼螃征、復(fù)用、解復(fù)用透敌、音視頻分離盯滚、合并、流化酗电、過濾器等功能魄藕。
- 可在iOS、Android撵术、Window背率、Linux馋评、Mac上運(yùn)行.
- 包含音頻/視頻編解碼庫libavcodec弧岳,具有非常高的可移植性和編解碼質(zhì)量晓避。
FFmpeg 歷史
- 2000年, 由法布里斯-貝拉(FabriceBellard)創(chuàng)建也切。
- 2004年, 邁克爾(Michael Niedermayer)接管。
- 2011年, Libav從FFmpeg分離饵筑。
主要的開發(fā)庫
- libavutil: 包含一些公共的工具函數(shù)埃篓,包括隨機(jī)數(shù)生成、數(shù)據(jù)結(jié)構(gòu)根资、核心多媒體工具等架专。
- libavcodec: 用于各種類型聲音/圖像encode/decode編解碼庫。
- libavformat: 用于各種音視頻封裝格式(mp4/AVI/Flv等)的生成和解析muxer/demuxer玄帕,包括獲取解碼所需信息以生成解碼上下文結(jié)構(gòu)和讀取音視頻幀等功能部脚。
- libavdevice: 讀取電腦(或者其他設(shè)備上)的多媒體設(shè)備的數(shù)據(jù) 或者輸出數(shù)據(jù)到指定的多媒體設(shè)備上。
- libswresample: 用于音頻采樣采樣數(shù)據(jù)(PCM)轉(zhuǎn)換的庫裤纹。
- libswscale: 用于視頻場景比例縮放委刘、色彩映射轉(zhuǎn)換的庫。
- libavfilter: 包含媒體濾波器的庫服傍。
主要的工具集:
- ffmpeg: 一個命令行工具钱雷,可用于格式轉(zhuǎn)換骂铁、解碼或電視卡即時編碼等吹零。
- ffsever: 一個 HTTP 、RTSP的實(shí)時廣播流媒體服務(wù)器.
- ffplay: 是一個簡單的播放器拉庵,使用ffmpeg 庫解析和解碼灿椅,通過SDL顯示。
- ffprobe: 一個多媒體流分析工具钞支。 它從多媒體流中收集信息 并且以人類和機(jī)器可讀的形式打印出來茫蛹。
FFmpeg 安裝
- 先在安裝Homebrew
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
- 再用Homebrew 安裝 ffmpeg
brew install ffmpeg
FFmpeg 處理音視頻流程
- 要有輸入文件: MP4/flv/mkv等具有封裝格式的文件, 里邊包含了音頻/視頻/字幕等很多數(shù)據(jù)。
- demuxer: 視音頻分離器分離數(shù)據(jù)烁挟。(會得到一些編碼數(shù)據(jù)包--壓縮后的數(shù)據(jù))
- decoder: 解碼婴洼,等到解碼后的數(shù)據(jù)幀。
- 自定義處理數(shù)據(jù)幀撼嗓,比如視頻720p轉(zhuǎn)化為480p等柬采。
- encoder: 壓縮數(shù)據(jù),得到另一種編碼數(shù)據(jù)包且警。
- muxer: 視音頻復(fù)用器封裝音視頻數(shù)據(jù)粉捻,得到指定格式的文件。(MP4/flv/mkv)
- 輸出數(shù)據(jù)斑芜。
?
ffmpeg 命令
基本信息查詢命令
- -version: 顯示版本
- -demuxers : 顯示可用的demuxers
- -muxers: 顯示可用的muxers
- -devices: 顯示可用的設(shè)備
- -codecs: 顯示可用的編解碼器
- -decoders: 顯示所有的解碼器
- -encoders: 顯示所有的編碼器
- -bsfs: 顯示比特流filter
- -formats: 顯示可用的格式
- -protocols: 顯示可用的協(xié)議
- -filters: 顯示可用的過濾器
- -pix_fmts: 顯示可用的像素格式
- -sample_fmts:顯示可用的采樣格式
- -layouts: 顯示channel名稱
- -colors:顯示識別的顏色名稱
例如: ffmpeg -version
錄制/播放命令
?
例 1:
ffmpeg -f avfoundation -i 1 -r 30 out.yuv (錄制視頻)
- -f: (-f avfoundation)指定使用Mac系統(tǒng)下的 avfoundation庫采集數(shù)據(jù)肩刃,avfoundation是用作音視頻處理的
- -i: 指定從哪采集數(shù)據(jù),它是一個文件索引號。(-i0:是攝像頭 -i1:是屏幕錄制)
- -r: 指定幀率盈包,fps沸呐,高清電影在60幀以上(-r60)
- out.yuv: 指定采集的yuv格式的數(shù)據(jù),yuv是原始格式數(shù)據(jù)呢燥,沒有任何壓縮
- ffmpeg -f avfoundation -list_devices true -i "": 查詢avfoundation下支持的設(shè)備列表
- control + c : 退出錄制
例 2:
ffplay -s 2880x1800 -pix_fmt uyvy422 out.yuv (播放)
- ffplay out.yuv: 播放視頻垂谢。(yuv是原始數(shù)據(jù)不知道視頻大小,ffplay默認(rèn)使用的像素格式y(tǒng)uv420p疮茄,如果使用例 1錄制滥朱,錄制默認(rèn)是uyvy422格式,無法正常播放力试。)
- ffplay -s 2880x1800 -pix_fmt uyvy422 out.yuv: 播放( 例 1 錄制可正常播放)徙邻。 -> (-s)指定尺寸大小,可以之前錄制的日志中找到畸裳;(-pix_fmt) 指定錄制的像素的格式
例 3:
ffmpeg -f avfoundation -i :0 out.wav (錄制音頻)
- ":" : ":"代表音頻設(shè)備
- ffplay out.wav: 播放音頻
例 4:
// (錄制音視頻同步缰犁。要錄制flv格式的,mp4格式的音頻錄制不上)
ffmpeg -f avfoundation -i 1 -f avfoundation -i :0 -r 30 out2.flv
分解復(fù)用命令
?
例 1:
// (將test.mp4轉(zhuǎn)換為test.flv)
ffmpeg -i test.mp4 -vcodec copy -acodec copy test.flv
- -i: 輸入文件
- -vcodec copy: 視頻編碼處理方式為復(fù)制
- -acodec copy: 音頻編碼處理方式為復(fù)制
例 2:
// 只提取視頻
ffmpeg -i test.mp4 -vcodec copy -an test.h264
- -an: (n:代表no)不要音頻數(shù)據(jù)
例 3:
// 只提取音頻
ffmpeg -i test.mp4 -acodec copy -vn test.aac
- -vn: (n:代表no)不要視頻數(shù)據(jù)
處理原始數(shù)據(jù)命令
?
例 1:
// 提取原始視頻yuv數(shù)據(jù)
ffmpeg -i test.mp4 -an -c:v rawvideo -pix_fmt yuv420p test.yuv
//播放yuv怖糊, 播放原始數(shù)據(jù)得告訴播放器數(shù)據(jù)格式類型
ffplay -s 540x960 test.yuv
- -c:v: 輸出視頻格式帅容。(rawvideo -> 原始數(shù)據(jù)格式)
例 2:
// 提取原始音頻pcm數(shù)據(jù)
ffmpeg -i test.mp4 -vn -ar 44100 -ac 2 -f s16le test.pcm
//播放pcm, 播放原始數(shù)據(jù)得告訴播放器數(shù)據(jù)格式類型
ffplay -ar 44100 -ac 2 -f s16le test.pcm
- -ar: 設(shè)定音頻采樣率(44100 -> 44k)
- -ac: 設(shè)定聲音的Channel數(shù)(1單聲道伍伤,2雙聲道并徘,3:立體聲)
- -f: 設(shè)定數(shù)據(jù)格式(s16le: s有正負(fù),16:16位扰魂,le:little end)
- .pcm: 聲音的原始數(shù)據(jù)
裁剪和合并命令
?
例 1:
// 裁剪前兩秒
ffmpeg -i test.mp4 -ss 00:00:00 -t 2 test1.ts
// 截取后兩秒
ffmpeg -i test.mp4 -ss 00:00:02 -t 2 test2.ts
- -ss: 指定開始時間 (00:00:02)
- -t: 指定持續(xù)時間(00:05)
例 2:
// 新建txt資源
touch resource.txt
// 編輯 resource.txt麦乞,并保存
file 'test1.ts'
file 'test2.ts'
// 使用 resource.txt和音視頻文件拼接
ffmpeg -f concat -i resource.txt test3.mp4
- -f contat: 設(shè)定文件拼接
圖片和視頻互轉(zhuǎn)命令
?
// 視頻每1秒生成15張圖片
ffmpeg -i test.mp4 -r 15 -f image2 image_%3d.jpeg
// 圖片生成視頻
ffmpeg -i image_%3d.jpeg test.mp4
- -r: 提取圖像頻率(用于視頻截圖)
- image2: 一種圖片格式
直播類命令
// 推流
ffmpeg -re -i test.mp4 -c copy -f flv address(服務(wù)器地址)
// 拉流
ffmpeg -i address(直播流地址) -c copy test.mp4
- -re :以本地幀頻讀數(shù)據(jù),避免獲取的幀率比本地快劝评,保持同步
濾鏡命令
?
例 1:
// 裁剪濾鏡
ffmpeg -i test.mp4 -vf crop=in_w-200:in_h-200 -c:v libx264 -c:a copy test1.mp4
- -vf: 設(shè)定視頻濾鏡
- -af: 設(shè)定音頻濾鏡
- -c:v: 設(shè)定視頻編碼器
- -c:a: 設(shè)置音頻編碼器