影片轉檔參數

轉檔除非參數下copy,否則畫質多少都會有損失
未來硬碟與網路速度只會愈來愈大,越快
所以我個人設定10G內的檔案轉檔只轉格式(ex:wmv-->mp4),不重新編碼
檔案如果很大(EX:藍光),20幾G以上,才會轉檔轉檔
2016/1/28測試 某影片以下列參數轉檔
00000.MTS--->2.1G
avconv -i 00000.MTS -crf 18 00000_crf18.mp4 ---> 2.4G
avconv -i 00000.MTS -crf 0 00000_crf0.mp4 ;--->28.9G
avconv -i 00000.MTS -c copy 00000_copy.mp4 ;--->2.0G

以 -c copy 似乎是最好的參數

[運轉檔網路串流mp4影片]
要加上 -movflags faststart 這個參數
EX:ffmpeg -i input.mp4 -movflags faststart -acodec copy -vcodec copy output.mp4

如用HandBrake,勾選 Web optimized


MP4文件由稱為atoms的數據塊組成。atoms存儲如字幕、章節、視頻和音頻數據。關於視頻和音頻atoms的位置的元數據以及有關如何播放視頻的信息,如每秒的尺寸和幀數,都存儲在稱為moov atoms的特殊atoms中。moov atoms可以把他想像為MP4的目錄章節。
當您播放視頻時,程序將通過MP4文件查找moov atoms,然後使用它來查找音頻和視頻數據的開始並開始播放。不幸的是,atoms可以以任何順序出現,所以程序不知道moov atoms將在哪裡提前。moov如果您已經擁有整個視頻文件,正在搜索找到該作品。但是,當您還沒有完整的視頻時,還需要另外一個選項,例如流式傳輸 HTML5視頻時。這就是流媒體視頻的全部內容!您可以開始觀看,而無需先下載整個視頻。

https://rigor.com/blog/2016/01/optimizing-mp4-video-for-fast-streaming


[使用命令列剪裁影片]
ffmpeg -i [input file] -t [duration] -codec copy [output file]
EX:去頭 從30秒的地方開始剪到影片的尾端
ffmpeg -ss 00:00:30 -i "input.avi" -codec copy "output.avi"
ffmpeg 換成avconv 也行(剪裁的參數ffmpeg與ffmpeg通用,其他參數不一定通用)
EX:去頭 從30秒的地方開始剪總共10分鐘長度的影片
ffmpeg -ss 00:00:30 -i "input.avi" -codec copy -t 00:10:00 "output.avi"
ffmpeg 換成avconv 也行(剪裁的參數ffmpeg與ffmpeg通用,其他參數不一定通用)
EX:從影片開始算起剪10分鐘長度的影片
ffmpeg -i "input.avi" -codec copy -t 00:10:00 "output.avi"
ffmpeg 換成avconv 也行(剪裁的參數ffmpeg與ffmpeg通用,其他參數不一定通用)

EX:從 00:00:30 開始剪到 00:01:45
ffmpeg -i inputFile -ss 00:00:30 -to 00:01:45 outputFile
ffmpeg -i inputFile -vcodec copy -acodec copy -ss 00:00:30 -to 00:01:45 outputFile
-ss 應該放在 -i 參數前; -t 必須放在輸出檔名之前。否則截取出的內容,可能會發生影像與聲音不同步的情形;又或者是截取到錯誤位置與長度。
[使用命令列合併影片-不適用wmv格式]
ffmpeg -i "concat:input1.mpg|input2.mpg|input3.mpg" -c copy output.mpg
ffmpeg -i "concat:input1.MTS|input2.MTS|input3.MTS" -c copy output.MTS
ffmpeg -i "concat:input1.M2TS|input2.M2TS|input3.M2TS" -c copy output.M2TS
mp4網路說用下面加參數的方式合併,沒試過,用上面的應該也可,但是合併的交接點可能會有點點問題
ffmpeg -i file1.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts '/tmp/tmp1'
ffmpeg -i file2.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts '/tmp/tmp2'
ffmpeg -i "concat:/tmp/tmp1|/tmp/tmp2" -c copy -bsf:a aac_adtstoasc output.mp4
參考
http://trac.ffmpeg.org/wiki/Concatenate
http://blog.changyy.org/2014/01/osx-ffmpeg-mp4-list-ffmpeg-concat-mac.html

[使用命令列合併影片-wmv]
用上列方式合併wmv會失敗,改用mencoder合併,要先安裝mencoder
sudo apt-get install mencoder


合併範例如下:
mencoder -ovc copy -oac copy file1.wmv file2.wmv file3.wmv file4.wmv -o output.wmv
因為這篇提到的方法,是利用 mencoder 指令把每個檔案的每一頁畫面逐一複製到新檔案的方式來合併,
所以只要是 mplayer 有支援的檔案格式都是可以用這個方式合併

[mkv 轉 mp4 無損轉換]
avconv -i file.mkv -c copy file.mp4

[avi 轉 mp4 無損轉換]
avconv -i file.avi -c copy file.mp4
無損轉換 上面的指令換成下面的也行
avconv -i file.mkv -c:v copy -c:a copy file.mp4
avconv -i file.avi -c:v copy -c:a copy file.mp4

[wmv 轉 x264 mp4]
/usr/bin/avconv -i "input
.wmv" -c:v libx264 -crf 18 -preset veryslow -acodec libvo_aacenc "output.mp4"
 
[wmv 轉 x265 mp4]
ffmpeg -i "input
.wmv" -c:v libx265 -preset medium -x265-params crf=20 -c:a aac -strict experimental -b:a 128k "output.mp4"


[轉webm (用VP9)]
ffmpeg -t 00:00:00 -i input.mkv -codec:v libvpx-vp9 -crf 18 -b:v 0 -threads 8 -speed 2 -tile-columns 6 -frame-parallel 1 -auto-alt-ref 1 -lag-in-frames 25 -c:a libopus -b:a 64k -f webm output.webm
轉vp9無法快轉,暫時不轉VP8與VP9
 
[ISO 轉 mp4]
1.先mount ISO
2.把VOB合併
3.把VOB轉無損mpg
4.把mpg轉mp4
ffmpeg -i "concat:VTS_01_1.VOB|VTS_01_2.VOB|VTS_01_3.VOB|VTS_01_4.VOB" -c copy -f vob ouput.mpg;\
/usr/bin/avconv -i ouput.mpg -crf 18 -filter:v yadif output.mp4;
-filter:v yadif--->去交錯 ,原本使用參數-deinterlace,但有下列提醒訊息
-deinterlace is deprecated, use -filter:v yadif instead
改成-filter:v yadif 就OK

[影片調整 亮度 對比 飽和]
avconv -i input.avi -c:v copy -c:a copy -vf "eq=contrast=1:brightness=0.1:saturation=1" output.mp4
contrast (對比 , 預設值 1 , 範圍 -2.0 ~ 2.0 )
brightness (亮度 , 預設值 0 , 範圍 -1.0 ~ 1.0)
saturation (飽和度 , 預設值 1 , 範圍0.0 ~ 3.0)

gamma (預設值 1 , 範圍0.1 ~ 10.0)

使用經驗
旅館的房間使用下列參數
contrast=1.5
brightness=0.3
saturation=1.5
gamma= 1
hqdn3d去噪點專用,因為暗調亮容易產生雜訊
ffmpeg -i input.mpg -vf "eq=contrast=1.5:brightness=0.3:saturation=1.5:gamma=1,hqdn3d" output.mp4

將亮度提高2倍:
ffmpeg -i input.avi -vf lutyuv="y=val*2" output.avi

ffmpeg -i input.avi -vf lutyuv="y=gammaval(0.5)" output.avi



綜整各種調整影片亮度的方式:
-filter:v lutyuv="y=gammaval(0.5)"; (數字越小越亮)
-filter:v lutrgb="r=val*8:g=val*8:b=val*8"; (數字越大越亮)
-filter:v lutyuv="y=val*5.0"; (數字越大越亮)


濾鏡參數合併
Good:

ffmpeg -i input.mov -vf "scale=480:270, lutyuv=y=val*4, lutyuv=y=gammaval(2.0)" output2.avi
Good:
ffmpeg -i input.mov -vf scale=480:270,lutyuv=y=val*4,lutyuv=y=gammaval'(2.0)' output2.avi


https://ffmpeg.org/ffmpeg-filters.html#eq

hqdn3d(high quality denoise 3-dimensional,是denoise3d的高級版本,是ffmpeg濾鏡的一部分)

[影片轉gif圖片]
加個hqdn3d(降噪濾鏡參數),檔案會再小一點
從影片開始轉總共10秒的影片,每秒10張,亮度,對比都調整 (-1代表不改變)
ffmpeg -i input.mp4 -t 10 -vf "fps=10,scale=iw:-1,eq=contrast=1:brightness=0" output.gif

從影片00:04:07開始轉總共10秒的影片,影片寬度變1/3
ffmpeg -i input.mp4 -ss 00:04:07 -t 10 -vf "fps=10,scale=iw/3:-1 ,hqdn3d" output.gif

iw、ih、ow、oh,分別表示輸入寬、輸入高、輸出寬、輸出高,假設要縮小到原來的1/2,則可以用
scale=iw/2:ih/2
假設要寬度變成原來的2/3,高度和最後的寬度一樣,則可以用
scale=2/3*iw:ow

GIF 檔案瘦身
$ convert -layers Optimize animation.gif animation_small.gif

將影片指定段落轉為一張張圖片
$ avconv -i myvideo.mp4 -ss 00:00:18 -t 5 -s 320x180 out%04d.gif
說明: -i 來源影片, -ss 截錄起點, -t 截錄長度(秒) -s 輸出尺寸, %04d 表示四位數流水號

將所有 GIF 圖片整合為 GIF 動畫檔
$ convert -delay 1x25 -loop 0 out*gif animation.gif
說明: -delay 1x25 表示 25fps, -loop 0 表示 GIF 動畫無限循環
查詢原始影片 fps: avconv -i myvideo.mp4 2>&1 | grep fps


[影片檔增加備註或其他訊息]
ffmpeg -i input.avi -c:v copy -c:a copy -metadata comment="備註內容" output.mp4

ffmpeg -i track05.wav \
-metadata title="Track #5" \
-metadata author="Unknown Artist" \
-metadata composer="Composer Unknown" \
-metadata album="Tracer Video Game Soundtrack" \
-metadata year="1996" \
-metadata track="5" \
-metadata comment="This is redbook CD audio track #5 from the Windows 95 game \"Tracer\"" \
-metadata genre="Game Soundtrack" \
-metadata copyright="Copyright 1996 Future Endeavors, Inc." \
-metadata description="Nifty techno background tune for a futuristic video game" \
-metadata synopsis="Hey, is this thing on? This is where the 'synopsis' field shows up." \
-metadata show="Tracer" \
-metadata episode_id="102" \
-metadata network="Some network" \
-acodec alac \
-y track05.m4a

http://multimedia.cx/eggs/supplying-ffmpeg-with-metadata/
http://wiki.multimedia.cx/index.php?title=FFmpeg_Metadata


[移除聲音]
ffmpeg -i input.mp4 -an output.mp4
-an 指的是 disable audio recording

[順時針旋轉 90 度]
avconv -i input.mp4 -vf transpose=1 -strict experimental transpose.mp4
transpose=0 表示先逆時針旋轉90°,再垂直翻轉
transpose=1 表示順時針旋轉90°
transpose=2 表示逆時針旋轉90°
transpose=3 表示順時針旋轉90°,再垂直翻轉
0 = 90CounterCLockwise and Vertical Flip (default)
1 = 90Clockwise
2 = 90CounterClockwise
3 = 90Clockwise and Vertical Flip
左右翻轉
ffmpeg -i foo.avi -vf hflip hflip.avi
上下翻轉
ffmpeg -i foo.avi -vf vflip vflip.avi

原本沒加 -strict experimental ,但出現了下列的錯誤,所以只好加上
encoder 'aac' is experimental and might produce bad results.
Add '-strict experimental' if you want to use it.

[左右翻轉]

avconv -i foo.avi -vf hflip hflip.avi

[上下翻轉]
avconv -i foo.avi -vf vflip vflip.avi
 




x265 壓縮三分鐘藍光影片,不同 Preset 與 CRF 參數的試驗結果(原始檔案大小709MB)

Preset value mediumPreset value slow
CRF 186m34.405s62.6MB15m13.802s64.9MB
CRF 206m17.139s43.9MB13m51.003s45.6MB
CRF 235m49.504s27.7MB9m11.176s15.7MB
CRF 285m11.953s15.6MB9m27.936s15.7MB


Constant Ratefactor (CRF)

此方法允許編碼器自動分配位元速率來試著達到一定輸出品質。讓每個畫格得到它需要的位元數來保持所需的品質等級。
CRF 會得到最佳的位元速率分配結果,缺點是你不能直接指定一個目標位元率或是檔案大小。
設定值範圍為 0–51.0,0 為最高品質,預設值為 23。比較低的數值會得到比較高的品質,
合理的範圍 18 - 28。考慮 18 為視覺無損 (或接近),所以它看起來應該與輸入相同 (或接近) 但它技術上不是無損。

固定品質參數範例

ffmpeg -y -i "Input.mkv" -f webm -codec:v libvpx -crf 20 –v:b 60000k -quality best -codec:a libvorbis -b:a 128k "Output.webm"

在參數中Input與Output是輸入、輸出檔案的位置及名稱,讀者可自行更改引號中的路徑,-f webm代表使用webm封裝,
-codec:v libvpx、-codec:a libvorbis分別表示以libvpx、libvorbis做為影音編碼格式。

控制影片的重要參數是「-crf 20 –v:b 60000k」這段文字,前方的crf代表品質參數,數字越小品質越好,推薦設在20到25之間。
v:b在這邊則代表視訊最大資料流量,因為crf參數可以發揮控制流量的效果,所以筆者建議不要在v:b中再次限制資料流量,
因此可將此參數設一極大數值,讓它不會影響編碼即可。-b:a則是音訊資料流量,若無特殊需求,128~196是可以兼顧品質與檔案大小的選擇。

如果你需要指定碼率就用2pass,2pass 的1st pass 只會輸出.stats,讓你壓2nd pass輸出實際檔案的時候合理分配碼率。
crf是恆定畫質。只跑一次,壓制速度比2pass快。缺點是無法預計輸出檔案的碼率。
如果沒特定的碼率需求,就用crf mode。Crf值愈低,畫質愈好。壓dvd的話18-22都可以。

關於壓制參數,我會建議你拿預設參數去調, preset slow或preset slower。想壓得好用preset slower

以固定品質編碼為範例,它可以在較短的編碼時間中,獲得較佳的畫質,但是它的問題是無法確認轉出影片的檔案大小,
經驗來看很少發生影片爆肥的情況,所以筆者還是推薦這種編碼方式。
x264 設定優先順序
preset > tune > 使用者設定選項 > fast first pass > profile > level

x264 preset

Preset 是一個選項集合,這設定一編碼速度來決定壓縮比。速度越慢則會得到更好的壓縮編碼效率 (畫質-位元率比 或 畫質-檔案大小比)。
也就是說,若你設定一個目標位元率或是檔案大小,則越慢的 Preset 將會得到更好的輸出品質。
而對於設定一個恆定品質 (CRF) 或是恆定量化值 (QP),你可以透過選擇更慢的 Preset 來簡單的節省位元率 (也就是得到更小的檔案大小)。

一般而言是使用你所能忍受的最慢 Preset。
目前 Presets 依速度遞減排序是: ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow, placebo。
該預設 Preset 是 medium。忽略 placebo 因為它會比 veryslow 浪費更多時間而且效果差異太小。

而越慢的 Preset 其 Reference frame (ref) 值也越高,例如 veryslow preset 的 ref 為 16。
由於通常不需這麼高的 ref,你可以透過指定一個 Level 來限制 ref,或是手動指定一個合理的 ref 值 (1 ~ 6)。

Tune選項;
Film (電影): 膠片電影。
Animation (動畫): 例如卡通/日本動畫。
Grain (膠片顆粒): 顆粒感很重的影片。
Still Image (靜止影像): 例如幻燈片效果的影片。
PSNR: 優化 PSNR 值。 Wiki
SSIM: 優化 SSIM 值。 Wiki
Fast Decode (快速解碼): 用於低性能播放設備。 (※ 壓縮率極低)
Zero Latency (零延遲): 處裡時間低延遲。主要用於直播等。 (※ 壓縮率極低)
 
H.264 Level
Level 表示了對播放設備的解碼性能要求
值越高,代表播放設備解碼性能要求越高,相對的輸出影片的壓縮率也越越高
 
 
x265
x265 預設的CRF是28,相當於x264的23 ,CRF決定壓縮品質,Preset 決定壓縮後的檔案大小
CRF設定20,preset 設定 medium與slow,品質都一樣,只是檔案大小有差別
  • default CRF of 28. The CRF of 28 should visually correspond to libx264 video at CRF 23, but result in about half the file size.
根據 FFmpeg and H.265 Encoding Guide 的說法,x265 的 CRF 28 等於 x264 的 CRF 23,又根據 FFmpeg and H.264 Encoding Guide 的說法,x264 的 CRF 18 相當接近於視覺上的無差別,而 DVD 的畫質約當於 480i,因此在 x265 放個 CRF 20 應該足夠,保守的話,就放個 CRF 16 或 CRF 17 吧
如果轉檔時出現 max_analyze_duration reached 的訊息,加入下列的參數,記得要放在 -i 之前(此為字幕用參數,如果不在乎字幕,可不加此參數)
-analyzeduration 100M

To coerce ffmpeg to search further for the subtitle stream, use options:

 -probesize  -analyzeduration 

which will cause ffmpeg to search until the first of those limits is reached. Note that both of these options must appear on the command line before the specification of the input via -i. For example:

 ffmpeg -probesize 50M -analyzeduration 100M -i vts.vob

will search through vts.vob for all streams until it has read 50 MB of data or 100 seconds of video, whichever comes first.

VP9參數解釋

CRF is the quality value (0-63 for VP9). To trigger this mode, you must use a combination of crf and b:v 0. bv MUST be 0.
要觸發CRF模式,您必須使用組合crf and b:v 0 必須為0。

speed 1 is a good speed vs. quality compromise. Produces output quality typically very close to speed 0, but usually encodes much faster.

VP9 tile-columns
Codec control function to set number of tile columns.

In encoding and decoding, VP9 allows an input image frame be partitioned into separated vertical tile columns, which can be encoded or decoded independently. This enables easy implementation of parallel encoding and decoding. This control requests the encoder to use column tiles in encoding an input frame, with number of tile columns (in Log2 unit) as the parameter: 0 = 1 tile column 1 = 2 tile columns 2 = 4 tile columns ..... n = 2**n tile columns The requested tile columns will be capped by encoder based on image size limitation (The minimum width of a tile column is 256 pixel, the maximum is 4096).

By default, the value is 0, i.e. one single column tile for entire image.
Supported in codecs: VP9

VP9E_SET_LOSSLESS
Codec control function to set lossless encoding mode.

VP9 can operate in lossless encoding mode, in which the bitstream produced will be able to decode and reconstruct a perfect copy of input source. This control function provides a mean to switch encoder into lossless coding mode(1) or normal coding mode(0) that may be lossy. 0 = lossy coding mode 1 = lossless coding mode

By default, encoder operates in normal coding mode (maybe lossy).
Supported in codecs: VP9

http://wiki.webmproject.org/ffmpeg/vp9-encoding-guide