2014-12-13 107 views
3

我寫以下代碼:爲什麼VideoClip的幀在寫入視頻文件時會發生變化?

from moviepy.editor import * 
from PIL import Image 
clip= VideoFileClip("video.mp4") 
video= CompositeVideoClip([clip]) 
video.write_videofile("video_new.mp4",fps=clip.fps) 

然後檢查這些幀是否已改變或沒有,並且如果改變,這功能改變它們,我檢索「剪輯」,「視頻」和「video_new的第一幀的.mp4' 和比較它們:

clip1= VideoFileClip("video_new.mp4") 
img1= clip.get_frame(0) 
img2= video.get_frame(0) 
img3= clip1.get_frame(0) 
a=img1[0,0,0] 
b=img2[0,0,0] 
c=img3[0,0,0] 

我發現,= 24,b = 24,但C = 26 .... INFACT上運行的陣列比較循環我發現, 'IMG1' 和 'IMG2'是相同的,但'img3'是不同的。 我懷疑是功能video.write_videofile負責陣列的變化。但我不知道爲什麼...有人可以向我解釋這一點,也建議一種方法來寫剪輯而不改變其框架?

PS:我讀的'VideoFileClip''FFMPEG_VideoWriter''FFMPEG_VideoReader'的文檔,但無法找到任何有用的......我需要閱讀的確切框架,因爲它是在我工作的一個代碼編寫之前。請給我一個方法。

回答

1

與JPEG相似,MPEG-4使用有損壓縮,因此從「video_new.mp4」中讀取的幀與「video.mp4」中的幀不完全相同也就不足爲奇了。和以及變化純粹由有損壓縮引起的也有出現的由於各種各樣的編碼選項可以由該寫入MPEG數據的程序一起使用的變化。

如果你真的需要能夠讀回你寫的完全相同的幀數據,那麼你將不得不使用不同的文件格式,但會被警告:你的文件將是巨大的!


視頻格式的選擇部分取決於圖像數據是什麼樣的,以及你想用它做什麼。如果數據使用256個色或更少,而且你不打算對其執行轉換,將修改顏色,簡單的GIF動畫是一個不錯的選擇。但請記住,即使像非整數縮放這樣的東西也會修改顏色。

如果要分析圖像數據並以各種方式對其進行轉換,則使用比GIF更好的顏色支持的格式,例如PNG圖像流,這是Zulko提到的他的回答。 FWIW,有相關的PNG格式的動畫稱爲MNG,但它不能很好地支持或廣爲人知。

另一種選擇是使用一串PPM圖像,或者甚至可以使用一串YUV數據,這對於某些類型的分析非常有用,而且如果您打算將其編碼爲MPEG以供最終消費使用,這種方法很方便。 PPM格式非常簡單,易於使用;由於YUV是一種沒有標題數據的原始格式,所以你必須自己跟蹤圖像大小和分辨率數據。

PPM或YUV的文件大小流很大,因爲它們包含不壓縮,但他們當然可以使用標準的壓縮技術,如果你想將它們保存到磁盤時節省一點空間被壓縮。 OTOH,使用這些流典型的視頻處理工作流程往往不打擾他們寫入到磁盤:他們是在管道發送(可能使用命名管道),所以文件大小爲(主要)無關。

儘管與基於MPEG的文件相比,這種格式佔用了大量空間,但在執行圖像數據分析和轉換時,它們遠遠優於用作中間格式的格式,因爲每次您寫回&回讀MPEG時,一點點的質量。

我假設您打算使用PIL/Pillow來進行圖像數據分析和轉換。但是您也可以使用ffmpeg/avconv命令行程序使用PPM & YUV流; ffmpeg家族也樂於使用各種圖像文件和GIF動畫。

+0

我應該使用哪些文件格式? – Ruchir 2014-12-13 14:29:06

+0

@Ruchir:我會爲我的回答添加一些信息。 – 2014-12-14 08:08:49

0

你可以有無損壓縮與「PNG」編解碼器:

clip.write_videoclip('clip_new.avi', codec='png') 

編輯@PM 2Ring:當你寫上面的線,它使正在使用PNG algortihm壓縮的視頻(我不確定每個幀是png還是更微妙)。

+0

那只是我寫的一個例子......我在我的原始代碼中合成視頻剪輯和圖像剪輯。 – Ruchir 2014-12-13 15:29:27

+0

感謝您的答案。 – Ruchir 2014-12-13 15:37:11

相關問題