1. 程式人生 > >用Python來段瘋狂的抖音舞

用Python來段瘋狂的抖音舞

農小王寫了一天的程式碼,水都沒有顧得上喝幾口!下班回家做地鐵的時候,總喜歡看一些休閒的東西,放鬆放鬆,看看新聞刷刷抖音,看看小姐姐的舞蹈,是一種不錯放鬆方式。

突然小王想既然我是一個程式設計師,為啥不用萬能的Python來寫一段魔性的抖音舞蹈呢,說幹就幹,查了資料發現Python還能真搞定,先來段舞蹈秀一下!

 

看上去很牛逼吧,其實做這樣一段視訊,只需要三步:

  • 將原視訊按幀拆分成圖片;
  • 將每張圖片轉換為字元圖並儲存;
  • 將字元圖按原幀率拼接成視訊。

01.

視訊拆分

python對視訊的處理需要用到一個叫作OpenCV的包,通過這個包可以很方便地獲取一個視訊的總幀數,然後依次讀取每幀資料儲存為圖片格式,來看程式碼:

上面這段程式碼中,主要完成3個功能:

  • cv2.VideoCapture()函式讀取視訊原檔案並生成一個視訊類物件;video.get(7)獲取視訊的總幀數。
  • video.read()有兩個返回值,第一個表示獲取下一幀資料是否成功,第二個儲存了下一幀的資料內容。
  • cv2.imwrite()用於將幀資料儲存為圖片。這部分程式碼功能應該說比較簡單,主要是對OpenCV包的運用。

02.圖片轉換

嚴格來說在這部分功能中需要做兩件事,一是將原圖轉換為字串,二是將字串畫入圖片。主要用到了PIL包中的Image、ImageFont、ImageDraw三個類。

1).生成字串

在這一步中,我們需要逐一讀入上一步中生成的原圖,獲取畫素尺寸,並將每一個畫素根據顏色和亮度轉換為相應的字元(下面這段程式碼就是畫素到字元的功能函式),然後將所有字元拼接為一整個字串。

這個過程中有一點需要特別注意:在遍歷圖片畫素時,每個畫素的尺寸相當於1,而用於填充的字元尺寸一般比較大,如果直接用字元替換圖片畫素,那麼轉換後的圖片將會遠遠超出圖片範圍。為此,在進行畫素遍歷前,需要將原圖按一定比例進行縮小,其中縱向比例為單個字元的高度,橫向比例為單個字元的寬度,當然,為例使轉換後的圖片更加美觀,也可以自行定義行間距和字元間距。

2).生成字元圖在這一步中,我們按照原圖尺寸建立一張新圖,然後將上一步中獲得的字串按照對應位置依次畫入該圖中。這裡唯一需要注意的就是遇到“n”字元時需要對座標位置進行調整,同時“n”字元不畫入圖片。

來看下這部分的部分程式碼:

def get_txt_image(path, filename):

im= Image.open(path + filename).convert('RGB')

raw_width = im.width

raw_height = im.height

im_txt = Image.new("RGB", (raw_width,raw_height), (255,255,255))

dr= ImageDraw.Draw(im_txt)

font=ImageFont.load_default().font

char = ' '

font_w, font_h = font.getsize(char)

h_dis = 1.5# 行間距

w_dis = 1.2# 字元間距

width = int(raw_width/font_w/w_dis)

height = int(raw_height/font_h/h_dis)

im= im.resize((width, height), Image.NEAREST)

txt=""

forrow in range(height):

forcolin range(width):

pixel = im.getpixel((col, row))

txt += get_char(*pixel)

txt += 'n'

來看看生成的字元圖...只看圖片效果並不明顯,果然還是要拼接成視訊才行啊。

03.視訊合成

這部分功能基本就是對第一部分的反操作,基本思路是建立一個新的視訊檔案,將上一步中得到的字元圖依次轉換為視訊幀資料並寫入到視訊檔案中,即完成了視訊合成操作,同樣是用到OpenCV包,示例程式碼如下:

上面這段程式碼中,也是完成3步:

  • cv2.VideoWriter_fourcc()用於指定視訊的編碼格式
  • cv2.VideoWriter()用於建立一個新的視訊物件,其引數依次代表檔名稱、編碼格式、幀率、圖幅
  • cv2.imread()用於將圖片轉換為待合成的視訊幀資料。

以上就是製作字元視訊的全部功能函式,接下來只要匯入相關包,建立一個主程式將它們串聯起來就可以製作你想要的字元視訊了。

最後提醒一點,OpenCV只支援avi的格式,而且生成的視訊檔案不能大於2GB,而且不能新增音訊,如果一定要在python裡新增音訊,可以使用subprocess包,但是我個人感覺使用專門的音視訊編輯軟體會更好一些。