Python - 使用OpenCV播放带声音的视频?

5
这可能是一个愚蠢的问题,我已经搜索过了但没有找到一个直接的答案:
你能否使用OpenCV和FFMPEG播放带有音频的视频?
如果不能,最好的方法是什么?这似乎很简单,但我对Python非常陌生,不知道该期望/搜索什么。
谢谢!

2
嗨@hoothoot,我看到没有人回答你的问题,但是你有没有想出解决办法呢?谢谢。 - cbautista
3个回答

9
使用ffpyplayer处理音频部分。
import cv2
import numpy as np
#ffpyplayer for playing audio
from ffpyplayer.player import MediaPlayer
video_path="../L1/images/Godwin.mp4"
def PlayVideo(video_path):
    video=cv2.VideoCapture(video_path)
    player = MediaPlayer(video_path)
    while True:
        grabbed, frame=video.read()
        audio_frame, val = player.get_frame()
        if not grabbed:
            print("End of video")
            break
        if cv2.waitKey(28) & 0xFF == ord("q"):
            break
        cv2.imshow("Video", frame)
        if val != 'eof' and audio_frame is not None:
            #audio
            img, t = audio_frame
    video.release()
    cv2.destroyAllWindows()
PlayVideo(video_path)

样例代码可以运行,但是您需要根据您的视频速度调整cv2.waitKey(28)。


抱歉,我现在才意识到我的源代码没有音频。它运行得很好,谢谢! - Mazziotti Raffaele
3
好的回答。不必猜测waitKey的毫秒睡眠值,您可以通过视频的FPS计算出它:video = cv2.VideoCapture(video_path)fps = video.get(cv2.CAP_PROP_FPS)sleep_ms = int(numpy.round((1/fps)*1000))。请注意,这些代码需要使用OpenCV和NumPy库。 - Sevag
@Sevag 即使修复了 sleep_ms 值的 waitKey,似乎仍存在音频和视频同步问题。 - Tumul Kumar
1
@Sevag,sleep_ms函数没有考虑处理时间,更好的方法是获取您开始播放视频的时间(以毫秒为单位),然后等待直到“start_time+video.get(CV_CAP_PROP_POS_MSEC)” - b-rad15
@b-rad15 我想我理解你正在解决的问题以及你通常如何解决它,但我无法让它正常工作。你能详细谈谈你的编辑吗? - iceAtNight7
显示剩余2条评论

2
如果音频无法正常工作,可以使用以下代码。
#date: 22 May 2022

#reference:https://github.com/thedreamcode/python_basics/blob/master/read_video_audio.py

import cv2
import numpy as np
from ffpyplayer.player import MediaPlayer


def getVideoSource(source, width, height):
    cap = cv2.VideoCapture(source)
    cap.set(cv2.CAP_PROP_FRAME_WIDTH, width)
    cap.set(cv2.CAP_PROP_FRAME_HEIGHT, height)
    return cap


def running_videos(sourcePath):
   
    camera = getVideoSource(sourcePath, 720, 480)
    player = MediaPlayer(sourcePath)

    while True:
        ret, frame = camera.read()
        audio_frame, val = player.get_frame()

        if (ret == 0):
            print("End of video")
            break

        frame = cv2.resize(frame, (720, 480))
        cv2.imshow('Camera', frame)

        if cv2.waitKey(20) & 0xFF == ord('q'):
            break

        #if val != 'eof' and audio_frame is not None:
            #frame, t = audio_frame
            #print("Frame:" + str(frame) + " T: " + str(t))

    camera.release()
    cv2.destroyAllWindows()

if __name__ == "__main__":
    running_videos( r"copy_path_to_video_file_here")

0
import numpy as np
import cv2
import pygame  #pip install pygame
from pygame import mixer
mixer.init()

file_name = "Intro1.mp4"
window_name = "window"
interframe_wait_ms = 30

cap = cv2.VideoCapture(file_name)
if not cap.isOpened():
    print("Error: Could not open video.")
    exit()
    
cv2.namedWindow(window_name, cv2.WND_PROP_FULLSCREEN)
cv2.setWindowProperty(window_name, cv2.WND_PROP_FULLSCREEN, cv2.WINDOW_FULLSCREEN)
mixer.music.load("Intro1.mp3")
mixer.music.play()

while (True):
    ret, frame = cap.read()
    if not ret:
        print("Reached end of video, exiting.")
        break

    cv2.imshow(window_name, frame)
    if cv2.waitKey(interframe_wait_ms) & 0x7F == ord('q'):
        print("Exit requested.")
        break

cap.release()
cv2.destroyAllWindows()

以上代码使用OpenCV库和Pygame库来显示一个有对应音频的视频文件。以下是代码的简要概述:

  1. 代码导入所需的库:NumPy、OpenCV和Pygame。
  2. 创建VideoCapture对象读取视频文件。
  3. 检查视频文件是否成功打开,若未成功则退出程序。
  4. 将命名窗口设置为全屏模式。
  5. 将音频文件加载到Pygame混音器中并开始播放。
  6. 进入while循环以读取视频的每一帧并在命名窗口中显示。
  7. 当视频文件结束时,程序打印一条消息并退出。

总的来说,这段代码允许您使用OpenCV和Pygame库播放具有相应音频的视频文件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接