Python使用OpenCV将音频添加到视频

10
我使用Python的cv2模块将jpg帧合并成视频,但是我无法添加音频。在Python中是否有可能不使用ffmpeg来给视频添加音频? 附言:对我的英语表达不好,抱歉。

你想要制作视频(保存)一个视频文件,还是想要播放带有音乐伴奏的视频效果而不创建文件?这两个目标非常不同。 - ivan_onys
4个回答

5
使用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)。


2
这对我不起作用。我应该怎么处理 imgt - mic
1
img 是帧的图像,而 t 是时间戳。我添加了它们,以便需要进一步处理的人使用。有关更多详细信息,请查看:https://pypi.org/project/ffpyplayer/ 或 https://matham.github.io/ffpyplayer/player.html。 - DK250
@DK250 音频和视频不同步。在我的情况下,音频稍微晚于帧通过时播放。 - Raj
@Raj 在 waitKey() 中增加数值。我认为你当前的数值太小了,视频播放得很快。 - DK250
因为这个示例没有包含音频,也忽略了视频帧率,所以被踩了。如果我理解 OP 的意思正确的话,输入应该是一个 JPEG 文件列表加上帧率或没有声音的视频(已经有帧率了),输出应该是一个带有音频的文件,可以在视频播放器应用程序中使用,如 QuickTime 或 VLC,或在浏览器中播放。 - ivan_onys

1
你可以使用pygame进行音频处理。 你需要初始化pygame.mixer模块, 在循环中,添加pygame.mixer.music.play()函数。 但是为此,你需要选择音频文件。
然而,我发现了更好的方法!你可以使用webbrowser模块播放视频(因为它会在浏览器上播放,所以你可以听到声音!)
import webbrowser webbrowser.open("video.mp4")

1

这是我读取音频和视频帧的方式:

from moviepy.editor import *
from pafy import pafy

if __name__ == '__main__':
    video = pafy.new('https://www.youtube.com/watch?v=K_IR90FthXQ')
    stream = video.getbest(preftype='mp4')

    video = VideoFileClip(stream.url)
    audio = video.audio
    for t, video_frame in video.iter_frames(with_times=True):
        audio_frame = audio.get_frame(t)
        print(audio_frame)
        print(video_frame)

这段代码下载YouTube视频并返回原始帧作为numpy数组。您可以将文件作为参数传递给VideoFileClip,而不是URL。

-1
import pygame

pygame.mixer.init()
pygame.mixer.music.load(
    'c:Your_file')
pygame.mixer.music.play()

while True:
    pygame.time.Clock().tick()
    #used to show that you can do other stuff while playing audio
    print("hi")

1
请记住,Stack Overflow 不仅旨在解决当前的问题,而且还要帮助未来的读者找到类似问题的解决方案,这需要理解底层代码。这对于我们社区中的初学者尤其重要,他们可能不熟悉语法。鉴于此,您能否编辑您的答案,包括对您正在做什么以及为什么认为这是最佳方法的说明 - Jeremy Caney

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