最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Pygame與OpenCV聯(lián)合播放視頻并保證音畫同步

 更新時間:2021年12月03日 10:58:54   作者:h281001460  
Pygame的Movie模塊已經廢棄多年,本文主要介紹了Pygame與OpenCV聯(lián)合播放視頻并保證音畫同步,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

Pygame是一個超好用的SDL綁定。自從有了Pygame,媽媽再也不用擔心我內存泄漏了。

但是這里有一個問題,Pygame的Movie模塊已經廢棄多年,這次做課題項目卻要在一個游戲中來段視頻播放。有點蒙圈。Ren'py提供的解決方案是使用libav,我嘗試了一早上也搞不明白pyav怎么用。后來干脆用手邊的OpenCV硬讀視頻吧。

這里說下第三方庫:

  • pygame
  • numpy
  • opencv-python

其中,numpy是Anaconda自帶,我沒自己裝過不知道,但是其他兩個都是可以用pip直接安裝的。

其實Pygame使用opencv或者moviepy不少見,就是使用pygame的pygame.surfarray接口可以把numpy矩陣轉化為surface,而這些視頻讀取庫能把每幀轉為numpy矩陣。這部分在下面代碼中都會體現(xiàn)。

我測試的視頻是來自ドラッグオンドラグーン(龍背上的騎兵3)的一段音游部分。音樂就是用pygame的音頻模塊隨便播放下就好。但是注意,視頻幀率必須設置為跟你的視頻一致,我這里是25fps。建議稍微多設置一點,比如25.5幀是對應25幀最好的選擇。因為留有余地。

平時你的游戲基本不可能莫名其妙的在邏輯中出現(xiàn)視頻播放,所以盡量單獨播放視頻,防止幀數(shù)掉出25.當然現(xiàn)代電腦這種情況比較少。

上圖:

ドラッグオンドラグーン

還是喜歡零姐啊?。?!

下面是基本的實現(xiàn)代碼

# -*- coding:utf-8 -*-
import pygame
import sys
import cv2
import numpy as np
import os


if __name__ == '__main__':
    pygame.init()  # 初始化pygame
    FPS = 25.5
    #設置窗口位置
    os.environ['SDL_VIDEO_WINDOW_POS']="%d,%d" % (50,70)
    FPSClock = pygame.time.Clock()
    size = width, height = 1280, 720  # 設置窗口大小
    screen = pygame.display.set_mode(size)  # 顯示窗口
    pygame.display.set_caption(u'打字游戲:反應練習')
    color = (255, 255, 255)  # 設置顏色

    ogg=pygame.mixer.Sound("game.ogg")
    # pygame.mixer.music.load("")

    videoCapture = cv2.VideoCapture("test.mp4")

    ogg.play()


    while True:
        a=pygame.time.get_ticks()

        if videoCapture.isOpened():
            #從opncv讀一段視頻進來
            ret, frame = videoCapture.read()
            #下面這句可以獲取圖像大小
            # print('frame.shape:', frame.shape)
            # 
            # rot90(m, k=1, axes=(0, 1)
            # m是要旋轉的數(shù)組(矩陣),
            # k是旋轉的次數(shù),默認旋轉1次,
            # 那是順時針還是逆時針呢?
            # 正數(shù)表示逆時針,而k為負數(shù)時則是對數(shù)組進行順時針方向的旋轉。
            # 視頻結束時會丟出一個ValueError異常
            try:
                frame = np.rot90(frame,k=-1)
            except:
                continue

            frame = pygame.surfarray.make_surface(frame)

            frame=pygame.transform.flip(frame,False,True)
            

            # frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)    
            screen.blit(frame, (0,0))

            # print()




        for event in pygame.event.get():  # 遍歷所有事件
            if event.type == pygame.QUIT:  # 如果單擊關閉窗口,則退出
                sys.exit()



        pygame.display.flip()  # 更新全部顯示
        time_next= FPSClock.tick(FPS)
        b=pygame.time.get_ticks()

    pygame.quit()  # 退出pygame

好了。這樣就實現(xiàn)了pygame播放視頻~~~~

才怪呢。

因為手欠,拖動了以下窗口,然后發(fā)現(xiàn),程序居然一直停留在拖動前的最后一幀,但我的音頻還是在播放,當我松開鼠標的時候,視頻圖像才重新開始顯示,這樣造成視音頻的同步上的問題,使鼠標松開后的視頻直接跟不上音頻。

尤其是這個部分是音游,一旦不同步,節(jié)奏對不上,感覺是要瘋。

這問題太難受了。

于是動手解決吧……

也不難,就是時間方面的問題。掌控時間,就是掌握了全局。

于是方案如下:

方案1:通過時間和跳幀。通過計算時間【就是時間差大于某個閾值,比如100ms】發(fā)現(xiàn)曾經發(fā)生過停止,然后進行跳幀。因為人類手速有限,所以完全可以閾值稍微大點,防止由于cpu方面的原因造成誤判。
方案2:重置音頻播放,計算視頻播放時間,讓音頻回到之前的狀態(tài)。這個簡單點,但是這不會太精確。需要仔細考慮使用哪個方案。
理論上跳幀方案比較好,因為幀量大,誤差小。并且音頻感官可以不缺失。

反復比較,選用方案一

算法如下:
設已有變量:
時間參量=下一幀-上一幀
跳幀計數(shù)器=0【在循環(huán)外】
閾值=200[時間參量大于此值說明出現(xiàn)故障]
跳幀系統(tǒng)檢測到閾值超標,使用以下算法跳幀:
使用 故障值/正確延時 ,得到要跳的幀數(shù)量。然后使計數(shù)器增長到這個數(shù)量,然后跳幀。

以下是帶有跳幀器的代碼

# -*- coding:utf-8 -*-
import pygame
import sys
import cv2
import numpy as np
import os
# 音頻同步跳幀實驗
# 新增:跳幀系統(tǒng)

if __name__ == '__main__':
    pygame.init()  # 初始化pygame
    FPS = 25.5
    # 設置窗口位置
    os.environ['SDL_VIDEO_WINDOW_POS'] = "%d,%d" % (50, 70)
    FPSClock = pygame.time.Clock()
    size = width, height = 1280, 720  # 設置窗口大小
    # screen = pygame.display.set_mode(size,pygame.FULLSCREEN)  # 顯示窗口
    screen = pygame.display.set_mode(size)  # 顯示窗口
    pygame.display.set_caption(u'打字游戲:反應練習')
    color = (255, 255, 255)  # 設置顏色

    ogg = pygame.mixer.Sound("game.ogg")
    # pygame.mixer.music.load("")

    videoCapture = cv2.VideoCapture("test.mp4")

    ogg.play()

    # 真正時間
    realtime = int(1000 / FPS)

    # 閾值-要稍微留下空間
    jumpyu = 100

    # 跳幀計數(shù)器
    jumpnum = 0

    while True:
        a = pygame.time.get_ticks()

        if videoCapture.isOpened():
        #這里是跳幀工具
            if jumpnum != 0:
           #這個函數(shù)光讀東西,比read少一個解碼過程,所以能省點算點
                videoCapture.grab()
                jumpnum -= 1
                continue
            ret, frame = videoCapture.read()
            try:
                frame = np.rot90(frame, k=-1)
            except:
                continue

            frame = pygame.surfarray.make_surface(frame)

            frame = pygame.transform.flip(frame, False, True)

            # frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
            screen.blit(frame, (0, 0))

            # print()

        for event in pygame.event.get():  # 遍歷所有事件
            if event.type == pygame.QUIT:  # 如果單擊關閉窗口,則退出
                sys.exit()

        pygame.display.flip()  # 更新全部顯示
        time_next = FPSClock.tick(FPS)
        b = pygame.time.get_ticks()
        k = b - a
		#此處檢測閾值,大于閾值做記錄準備跳幀
        if k > jumpyu:
            print('超過閾值,跳幀')
            temp = (k - realtime)/realtime
            tempstr=str(temp)
            tempstr=tempstr[tempstr.find('.')+1:]
            if len(tempstr)>1 or tempstr[0]!='0':
                jumpnum+=(int(temp)+1)
                print('跳小數(shù)幀')
            else:
                print('跳整數(shù)幀')
                jumpnum+=int(temp)
            print('跳'+str(jumpnum)+'幀')

    pygame.quit()  # 退出pygame

看看成果:為了截圖拖了幾下窗口,于是就已經智能跳幀了多次了。

跳幀輸出

搞定收工,這次將手賤拖動窗口造成的音畫同步問題降低到最小。至少這個視頻是沒怎么出現(xiàn)節(jié)奏問題了。當然,最好的建議還是別亂拖動窗口,畢竟再精確也無法做到幀級別的完全精確。就算是全屏與窗口切換也是會有幀損失的。emm…

到此這篇關于Pygame與OpenCV聯(lián)合播放視頻并保證音畫同步的文章就介紹到這了,更多相關Pygame OpenCV播放視頻內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Python實現(xiàn)迪杰斯特拉算法并生成最短路徑的示例代碼

    Python實現(xiàn)迪杰斯特拉算法并生成最短路徑的示例代碼

    這篇文章主要介紹了Python實現(xiàn)迪杰斯特拉算法并生成最短路徑的示例代碼,幫助大家更好的理解和使用python,感興趣的朋友可以了解下
    2020-12-12
  • django 常用orm操作詳解

    django 常用orm操作詳解

    下面小編就為大家?guī)硪黄猟jango 常用orm操作詳解。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • 對python函數(shù)簽名的方法詳解

    對python函數(shù)簽名的方法詳解

    今天小編就為大家分享一篇對python函數(shù)簽名的方法詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-01-01
  • 詳解Python如何實現(xiàn)輸出顏色字體到終端界面

    詳解Python如何實現(xiàn)輸出顏色字體到終端界面

    在終端中,輸出的字體總是單一顏色的,黑底白字。但是在一些場景并不能很好的滿足輸出的需求。本文為大家介紹了Python如何實現(xiàn)輸出顏色字體到終端界面中,需要的可以參考一下
    2022-12-12
  • Python判斷兩個list是否是父子集關系的實例

    Python判斷兩個list是否是父子集關系的實例

    今天小編就為大家分享一篇Python判斷兩個list是否是父子集關系的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-05-05
  • Python3 利用requests 庫進行post攜帶賬號密碼請求數(shù)據(jù)的方法

    Python3 利用requests 庫進行post攜帶賬號密碼請求數(shù)據(jù)的方法

    今天小編就為大家分享一篇Python3 利用requests 庫進行post攜帶賬號密碼請求數(shù)據(jù)的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-10-10
  • 公認8個效率最高的爬蟲框架

    公認8個效率最高的爬蟲框架

    在本篇文章里小編給大家整理的是關于2020年8個效率最高的爬蟲框架知識點,需要的朋友們可以學習下。
    2020-07-07
  • python編寫softmax函數(shù)、交叉熵函數(shù)實例

    python編寫softmax函數(shù)、交叉熵函數(shù)實例

    這篇文章主要介紹了python編寫softmax函數(shù)、交叉熵函數(shù)實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-06-06
  • Pycharm中配置Jupyter環(huán)境的圖文教程

    Pycharm中配置Jupyter環(huán)境的圖文教程

    本文主要介紹了Pycharm中配置Jupyter環(huán)境的圖文教程,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-07-07
  • python實現(xiàn)手機號歸屬地查詢功能

    python實現(xiàn)手機號歸屬地查詢功能

    手機上突然收到了某銀行的短信提示,看了一下手機的位數(shù),正好是11位,我一想,這不就是標準的手機號碼嗎?于是想用python的庫實現(xiàn)查詢手機號碼歸屬地查詢自由,所以本文給大家介紹了如何用python實現(xiàn)手機號歸屬地查詢功能,需要的朋友可以參考下
    2024-03-03

最新評論

宁河县| 永福县| 磐安县| 虞城县| 惠来县| 长海县| 阳泉市| 连城县| 双江| 渭南市| 新蔡县| 革吉县| 区。| 永泰县| 滦平县| 固安县| 措美县| 古浪县| 荃湾区| 江门市| 逊克县| 乌鲁木齐市| 宁城县| 玉林市| 南京市| 翁牛特旗| 临漳县| 手游| 汉中市| 永定县| 贵定县| 汨罗市| 横山县| 东丽区| 和政县| 连城县| 中山市| 临城县| 运城市| 霍山县| 平阴县|