FFmpeg_logo.png
整體的目標
- [ ] 完成將多張圖片轉換成視頻。并添加背景音樂的任務。
- [ ] 完成將音頻混音到視頻中的任務。
- [ ] 完成將找到的視頻合并的任務。
目前計劃確定
- [ x ] 1. 尋找Android端可以解決的方案
- [ x ] 2. 了解方案和實現
- [ x ] 3. 完成任務
具體內容
FFmpeg的了解
FFmpeg的介紹網上還是很多的。官網的wiki上面也有很多內容。圍繞目標,主要是有兩套實現的思路。早期,其實是想通過自己編寫C代碼,來完成整個流程的。但是無奈目前的水平有限,而且時間不夠充裕。故最后的思路是通過學習現有的命令行參數,來快速完成FFmpeg的使用。但是這樣的弊端也極大的,在此暫時不訴。
FFmpeg主要包含了以下幾個核心的庫:
- libavformat
用于各種音視頻封裝格式的生成和解析,包括獲取解碼所需信息以生成解碼上下文結構和讀取音 視頻幀等功能;音視頻的格式解析協議,為 libavcodec 分析碼流提供獨立的音頻或視頻碼流源。- libavcodec
用于各種類型聲音/圖像編解碼;該庫是音視頻編解碼核心,實現了市面上可見的絕大部分解碼器 的功能,libavcodec 庫被其他各大解碼器 ffdshow,Mplayer 等所包含或應用。- libavdevice
硬件采集、加速、顯示。操作計算機中常用的音視頻捕獲或輸出設備: ALSA,AUDIO_BEOS,JACK,OSS,1394,VFW。- libavfilter
filter(FileIO、FPS、DrawText)音視頻濾波器的開發,如寬高比 裁剪 格式化 非格式化 伸縮。- libavutil
包含一些公共的工具函數的使用庫,包括算數運算 字符操作;- libavresample
音視頻封轉編解碼格式預設等。- libswscale
(原始視頻格式轉換)用于視頻場景比例縮放、色彩映射轉換;圖像顏色空間或格式轉換,如 rgb565
rgb888 等與 yuv420 等之間轉換。- libswresample
原始音頻格式轉碼- libpostproc:
(同步、時間計算的簡單算法)用于后期效果處理;音視頻應用的后處理,如圖像的去塊效應。 ffmpeg:該項目提供的一個工具,可用于格式轉換、解碼或電視卡即時編碼等;
- ffsever
一個 HTTP 多媒體即時廣播串流服務器;- ffplay
是一個簡單的播放器,使用 ffmpeg 庫解析和解碼,通過 SDL 顯示;
從官網上下載好ffmpeg,進入FFmpeg命令行工具所在的文件夾,就開始干活。
因為直接使用cmd 是沒有歷史記錄的,所以書內推薦使用其他的客戶端來操作,但是為了便捷,則是還是使用最簡單的工具。
FFmpeg Basic的學習
- 參考FFmpeg Basic FFmpeg封裝好的命令行整體是是這樣的
Command line syntax
ffmepg [global options] [input file options] -i input_file [output file options] output_file
[ ]中的內容是可選的參數,其他則是必填的參數。
一圖比千言—CommanLine.png
-
使用ffmpeg進行轉碼
ffmpeg可以輸入各種文件或者流,進行操作。整體的工作流程是解碼器將未壓縮的幀數據在經過filter之后,再進行編碼和輸出。其中很重要的一點就是它能夠構造一個 filterchains 和 filtergraphs (濾鏡鏈和濾鏡圖)。
轉碼流程.png
看了這個圖,可能會問 什么是 packets ,什么是frames ,在這里暫且不表
-
Filters,filter chains 和filtergraphs
在多媒體的進程中,filter意味著在輸入文件進行編碼之前將其修改的一個軟件工具。他被分成音頻的濾鏡和視頻的濾鏡。FFmpeg已經內置好了多種濾鏡而且能夠通過多種方式結合他們使用。這樣簡化了媒體的進程,因為在編解碼的過程中。會整體的質量。 libavfilter就是整個軟件庫。使用-vf 來操作視頻濾鏡 使用 -af來使用音頻的濾鏡。
Filter syntax
[input_link_label1]...
filter_name=parameters
[output_link_label1]...
#####Filterchain
"filter1,filter2,...."
#####Filtergraph
"filterchain1;filterchain2;..."
#####使用filtergraph能夠有效的簡化命令行。將兩行變成一行
#使用前
ffmpeg -i input.mpg -vf hqdn3d,pad=2*iw outpt.mp4
ffmpeg -i output.mp4 -i input.mpg -filter_complex overlay=w compare.mp4
#使用后
ffplay -i i.mpg -vf split[a][b];[a]pad=2*iw[A];[b]hqdn3d[B];[A][B]overlay=w
# 將輸入的i.mpg 分成[a]和[b] ;將[a]左右一個filterchains的輸入,輸出為[A];將[b]作為輸入,輸出為[B],最后再將[A][B] 通過overLay filter產生一個對比。
加上Filter之后的總體流程
-
媒體流的選擇。
-
許多封裝格式存在多個流媒體。ffmpeg能夠識別5種流。 audio(a),attachment(t),data(d),subtitle(s) and video(v)。可以通過-map后面添加這些參數來完成選擇。
syntax
file_number:stream_type [:stream_number] #其中file_number、stream_number都是從0開始。 #-map 0 表示選擇所有 #-map i:v表示從角標為i的文件中選擇所有的視頻流。 -map: i:a 則是所有的音頻流 # -an,-vn,-sn 簡單的理解就是 剔除音頻。視頻。和字母(... no ..) #將A中的視頻和B中的音頻和C中的字幕合并到clip.mov中 ffmpeg -i A.mov -i B.mov -i C.mov -map 0:v:0 -map 1:a:0 -map 2:s:0 clip.mov
-
- 除此之外,還有其他的可以定義流的信息
#-b 可以設置音頻和視頻的bit rate
ffmpeg -i input.mpg -b:a 128k -b:v 1500k outpu.mp4

4. **有用的命令。**
將輸出輸出到文件當中。
ffmpeg -help > help.txt
ffmpeg -filters >> data.txt #續寫
5. **概念的介紹**
比特率、幀率和文件大小之間的關系
#####幀率。
每秒被編碼到視頻文件中的幀數。人眼至少需要15fps,才能舉得是一個連續的滑動。它也進程被較為一個幀的頻繁度 。它的單位是Hz.LCD顯示器通常是60Hz的。
```shell
# 直接使用- r 能夠制定幀率
ffmepg -i input -r fps output
#使用fpsfilter來指定幀率
ffmpeg -i clip.mpg -vf fps=fps=25 clip.webm
比特率
確定的是音頻和視頻總體的質量。它定義的是 每個時間單元攜帶的數據量。
Type | Abbreviation | |
---|---|---|
Average bit rate | ABR | 每秒平均的比特率。在VBR編碼模式下也需要。通常用于確定的輸出大小 |
Constant bit rate | CBR | 每秒處理的比特率是相同的。這并不實際。因為在運動的處理過程中,需要更多的比特率。CBR通常用于在混合多媒體流的時候使用。 |
Variable bit rate | VBR | 可變的比特率。簡言之就是需要多的時候多,反之亦然。但是同樣需要更多的cpu來處理這些判斷 |
之前說過,通過-b就可以設定比特率。-b:v 就 可以設定視頻
# 在視頻通話中,因為傳輸的數據不能被緩存。所有需要設定
#一個固定的比特率來輸出。通常需要設定三個參數。 -b -minrate -maxrate .設置maxrate的同時,還得設置一個 -bufsize來緩存。
ffmpeg -i in.avi -b 0.5M -minirate 0.5M -maxrate 0.5M -bufsize 1M out.mkv
#為了控制文件的大小,可以使用 -fs
ffmpeg -i -input.avi -fs 10MB output.mp4
文件大小的計算公式
- 視頻大小
video_size =vieo_birate * time_inseconds/8 - 音頻大小
(未壓縮)audio_size=sampling_ratebit_depthchannelstime_in_seconds/8
(壓縮)audio_size = bitrate time_in_seconds/8
最后計算的文件,應該比兩個相加還略大一點。因為還有以下meta data 和overhead。
未完待續。。。