pygame播放視頻并實(shí)現(xiàn)音視頻同步的解決方案
一、前言
在我接觸pygame時(shí)最新的pygame已經(jīng)不支持movie模塊,這就導(dǎo)致在pygame播放視頻變成一個(gè)問題,網(wǎng)上搜了下解決方案有兩個(gè):
一是使用opencv播放視頻,再結(jié)合pygame.mixer來播放音頻
二是使用moviepy播放視頻,再結(jié)合pygame.mixer播放音頻
上述兩個(gè)方案其實(shí)都是先將mp4的視頻分離成“畫面幀”和“mp3音頻”,所謂的播放實(shí)際上是不停地在切換“畫面幀”,同時(shí)播放音頻,最終實(shí)現(xiàn)音視頻的同時(shí)播放。
但上述兩個(gè)方案都存在“音畫同步”的問題,因?yàn)闊o論是opencv還是moviepy都只負(fù)責(zé)將視頻切片成幀,播放則是pygame自己在執(zhí)行一個(gè)while循環(huán)來不停切換界面上展示出來的圖片幀,這也就導(dǎo)致while循環(huán)很快就將幀播放完畢,而音頻則還按著原有節(jié)奏緩慢播放。
解決是在while循環(huán)中加入合適的延時(shí)同時(shí)根據(jù)當(dāng)前視頻播放進(jìn)度來設(shè)置音頻的播放起點(diǎn)以實(shí)現(xiàn)同步,但這個(gè)方案據(jù)我實(shí)踐在加入延時(shí)后就實(shí)現(xiàn)了較好的音畫同步效果不知道為啥還要去設(shè)置音頻的播放起點(diǎn),另外在設(shè)置音頻播放起點(diǎn)時(shí)一直提示錯(cuò)誤也不知道為何,所以我這里提供兩個(gè)方案:
方案一:在while循環(huán)中加入延時(shí),短視頻測(cè)試效果還行
方案二:根據(jù)音頻的播放節(jié)奏來決定視頻幀的播放節(jié)奏,這樣音畫肯定是同步的
我選擇使用moviepy來做,因?yàn)閙oviepy從mp4中分離mp3比較簡(jiǎn)單。
二、方案一
在項(xiàng)目的目錄下新建videos目錄,并放入一個(gè)測(cè)試使用的mp4文件test.mp4
上述代碼實(shí)際上是將整個(gè)游戲的幀率設(shè)置成與視頻一致,這樣可能存在一些隱患(直覺)。
三、方案二
代碼如下:
上述代碼的邏輯如下:
1、通過“pygame.mixer.music.get_pos()”獲取當(dāng)前音頻的播放進(jìn)度
2、通過音頻播放進(jìn)度除以視頻的總時(shí)長(zhǎng),得到音頻播放的百分比進(jìn)度(音畫同步的話,音頻百分比進(jìn)度就應(yīng)該跟視頻百分比進(jìn)度一致)
3、百分比進(jìn)度乘以視頻總幀數(shù)可得到當(dāng)前應(yīng)當(dāng)播放哪一個(gè)視頻幀
4、再判斷一下當(dāng)前實(shí)際播放的幀是否已超過了理論應(yīng)該播放的視頻幀(是的話就跳過當(dāng)前幀的播放)
注意音頻播放結(jié)束或視頻幀播放結(jié)束都要結(jié)束視頻的播放。
四、總結(jié)
本篇提供了pygame播放視頻的兩個(gè)方案,第一個(gè)方案是網(wǎng)上找的現(xiàn)成的,第二個(gè)方案則是參考了opencv(主流方案)自己逆向思維做的,還未經(jīng)過實(shí)際驗(yàn)證。
到此這篇關(guān)于pygame播放視頻并實(shí)現(xiàn)音視頻同步的文章就介紹到這了,更多相關(guān)pygame播放視頻內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
分享python數(shù)據(jù)統(tǒng)計(jì)的一些小技巧
今天這些小技巧在處理python的一些數(shù)據(jù)方面還是很有幫助的,希望能幫到在這方面有需要的童鞋~2016-07-07python實(shí)現(xiàn)輸入三角形邊長(zhǎng)自動(dòng)作圖求面積案例
這篇文章主要介紹了python實(shí)現(xiàn)輸入三角形邊長(zhǎng)自動(dòng)作圖求面積案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-04-04Python登錄并獲取CSDN博客所有文章列表代碼實(shí)例
這篇文章主要介紹了Python登錄并獲取CSDN博客所有文章列表代碼實(shí)例,具有一定借鑒價(jià)值,需要的朋友可以參考下2017-12-12Python計(jì)算雙重差分模型DID及其對(duì)應(yīng)P值使用詳解
這篇文章主要介紹了Python計(jì)算DID及其對(duì)應(yīng)P值的使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2021-09-09Python入門教程(十八)Python的For循環(huán)
這篇文章主要介紹了Python入門教程(十八)Python的For循環(huán),Python是一門非常強(qiáng)大好用的語言,也有著易上手的特性,本文為入門教程,需要的朋友可以參考下2023-04-04Python中生成隨機(jī)密碼的多種超實(shí)用實(shí)例
隨機(jī)密碼生成器是一種常見的工具,用于生成強(qiáng)密碼,下面這篇文章主要給大家介紹了關(guān)于Python中生成隨機(jī)密碼的多種超實(shí)用實(shí)例,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-05-05C# DataGridView行列轉(zhuǎn)換的具體實(shí)現(xiàn)
本文主要介紹了C# DataGridView行列轉(zhuǎn)換的具體實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02