2016-06-01 209 views
2

我正在使用ffmpeg將高質量視頻轉換爲gif,大部分視頻都是60fps及以上720p,但是當我使用下面的代碼將視頻轉換爲gif時,我變得非常低幀率爲GIF輸出,使用ffmpeg將mp4轉換爲gif時使用ffmpeg下載fps

#!/usr/bin/env 
palette=/tmp/pallete.png 
filter="fps=50,scale=480:-1:flags=lanczos" 

ffmpeg -y -i test.mov -vf $filter,palettegen=stats_mode=diff $palette 
ffmpeg -y -i test.mov -i $palette -lavfi "$filter [x]; [x][1:v] paletteuse" test.gif 

我注意到另一個問題是 - 隨着寬度增加例如720代替480我得到更低的FPS。

這裏是輸出日誌例如,輸出FPS比分配50fps

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/tmp/201631203815.mp4': 
Metadata: 
major_brand  : isom 
minor_version : 512 
compatible_brands: isomiso2avc1mp41 
encoder   : Lavf56.36.100 
Duration: 00:00:05.48, start: 0.016000, bitrate: 1579 kb/s 

Stream #0:0(und): Video: h264 (Constrained Baseline) (avc1/0x31637661), yuv420p, 1334x1334, 1576 kb/s, 60.18 fps, 60 tbr, 1000k tbn, 50 tbc (default) 
Metadata: 
    handler_name : VideoHandler 

Input #1, png_pipe, from '/tmp/pallete.png': 
    Duration: N/A, bitrate: N/A 
Stream #1:0: Video: png, rgba(pc), 16x16 [SAR 1:1 DAR 1:1], 25 tbr, 25 tbn, 25 tbc 

Output #0, gif, to '/tmp/201631203815.gif': 
Metadata: 
    major_brand  : isom 
    minor_version : 512 
    compatible_brands: isomiso2avc1mp41 
    encoder   : Lavf56.40.101 
Stream #0:0: Video: gif, pal8, 480x480, q=2-31, 200 kb/s, 50 fps, 100 tbn, 50 tbc (default) 
Metadata: 
    encoder   : Lavc56.60.100 gif 
Stream mapping: 
    Stream #0:0 (h264) -> fps 
    Stream #1:0 (png) -> paletteuse:palette 
    paletteuse -> Stream #0:0 (gif) 
Press [q] to stop, [?] for help 

frame= 275 fps= 32 q=-0.0 Lsize= 2480kB time=00:00:05.50 bitrate=3693.5kbits/s  

下如何保證輸出FPS總是什麼由用戶設定? 對此的任何資源非常感謝。

UPDATE

我也注意到,使用較高的FPS的例如filter="fps=90,scale=480:-1:flags=lanczos"具有減慢GIF,象緩慢的運動的影響的效果,該輸出FPS是圍繞15fps的還要低,

回答

5

設置fps值顯式地給出了相同的下FPS輸出 結果幀= 346 FPS = 24,Q = -0.0 LSIZE = 6506kB時間= 00:00:06.92 比特率= 7701.8kbits/s的

這不是輸出fps!這是編碼速度。大多數玩家不能正確播放GIF格式的幀率高於50。請參閱顯示此行爲的demo

+0

這很有道理,它似乎像50 fps堅持提供最佳的視頻時gif使用gfycat轉換爲mp4, –

+1

@ 8bittree更改爲存檔鏈接。 – Mulvya

2

我沒有使用FFmpeg製作GIF文件的經驗,但據我所知,fps篩選器對於實際的幀率值有一個單獨的「fps」參數,所以我認爲如果您忽略該參數可能無法正常工作。

只是爲了確保過濾得到正確的值,你應該明確設置fps值:

filter="fps=fps=50,scale=480:-1:flags=lanczos" 

如果它不工作,我會嘗試常規的「速度」選項太多:

ffmpeg -y -i test.mov -i $palette -lavfi "$filter [x]; [x][1:v] paletteuse" -r 50 test.gif 

其他方面,你的控制檯輸出看起來不錯(它表明輸出將是50fps),所以這些現象有點神祕。


工作液:

所有你需要做的是打破過程分爲三個單獨的步驟,並使用「-framerate」多路分解器選項。

首先,讓我們產生了調色板文件:

ffmpeg -i <input_file> -filter_complex "scale=w=480:h=-1:flags=lanczos, palettegen=stats_mode=diff" palette.png 

其次,打破了視頻幀轉換爲圖像文件:

ffmpeg -i <input_file> -r 50 -f image2 image_%06d.png 

最後,加入所述圖像成一個GIF序列: (中這裏的重要部分是image2分路器的幀率選項!)

ffmpeg -framerate 50 -i img_%06d.png -i palette.png -filter_complex "[0]scale=w=400:h=-1[x];[x][1:v] paletteuse" -pix_fmt rgb24 output.gif 

編輯:最後找到答案!

您需要使用image2 demuxer的-framerate選項!(回答相應編輯)

替代方法:

  • gifsickle - 圖像轉換成GIF,可設置幀延遲
  • ImageMagic - 可以轉換視頻直接GIF,優良的gif質量控制選項。
+0

如果按源代碼中指定的順序提供值,則FFmpeg過濾器不需要密鑰名稱。 – Mulvya

+0

這不是一個難題,謝謝你的信息! –

+0

設置fps值明確給出了相同的較低fps輸出結果'''frame = 346 fps = 24 q = -0.0 lsize = 6506kB time = 00:00:06.92 bitrate = 7701.8kbits/s''' –