gpt4 book ai didi

python - 如何从相机(或网络摄像头)在 python 中捕获视频(和音频)

转载 作者:IT老高 更新时间:2023-10-28 21:01:46 25 4
gpt4 key购买 nike

我正在寻找一个解决方案,无论是在 linux 中还是在 windows 中,让我能够

  • 同时从我的网络摄像头和麦克风录制视频(+音频)。
  • 将其保存为 file.AVI(或 mpg 等)
  • 在录制视频时在屏幕上显示视频

在我的情况下,压缩不是问题,我实际上更喜欢捕获 RAW 并稍后压缩它。

到目前为止,我已经在 VB 中使用了一个 ActiveX 组件来处理所有事情,我想继续使用 python(VB 解决方案不稳定、不可靠)。

到目前为止,我已经看到了仅捕获 VIDEO 或单个帧的代码...

我已经看过了

  • OpenCV - 在那里找不到音频捕获
  • PyGame - 无同步音频捕获 (AFAIK)
  • VideoCapture - 仅提供单帧。
  • SimpleCV - 无音频
  • VLC - 将 VideoLAN 程序绑定(bind)到 wxPthon - 希望它可以做到(仍在研究这个选项)
  • kivy - 刚听说过,没能在 Windows SO FAR 下运行。

问题 - 是否有适用于 python 的视频和音频捕获库?

或者 - 如果有的话,还有哪些其他选项?

最佳答案

回答:没有。python 中没有单一的库/解决方案可以同时进行视频/音频录制。您必须分别实现并以智能方式合并音频和视频信号以最终生成视频/音频文件。

我为您提出的问题找到了解决方案。我的代码解决了您的三个问题:

  • 同时录制来自网络摄像头和麦克风的视频和音频。
  • 它将最终的视频/音频文件保存为 .AVI
  • 取消注释第 76、77 和 78 行将使视频在录制时显示在屏幕上。

我的解决方案使用 pyaudio 进行音频录制,使用 opencv 进行视频录制,使用 ffmpeg 混合这两个信号。为了能够同时记录两者,我使用多线程。一个线程录制视频,第二个线程录制音频。我已经将我的代码上传到了 github,并且在这里也包含了它的所有重要部分。

https://github.com/JRodrigoF/AVrecordeR

注意:opencv 无法控制网络摄像头进行录制的 fps。它只能在文件的编码中指定所需的最终 fps,但网络摄像头通常会根据规范和光照条件(我发现)表现不同。所以fps要控制在代码层面。

import cv2
import pyaudio
import wave
import threading
import time
import subprocess
import os

class VideoRecorder():

# Video class based on openCV
def __init__(self):

self.open = True
self.device_index = 0
self.fps = 6 # fps should be the minimum constant rate at which the camera can
self.fourcc = "MJPG" # capture images (with no decrease in speed over time; testing is required)
self.frameSize = (640,480) # video formats and sizes also depend and vary according to the camera used
self.video_filename = "temp_video.avi"
self.video_cap = cv2.VideoCapture(self.device_index)
self.video_writer = cv2.VideoWriter_fourcc(*self.fourcc)
self.video_out = cv2.VideoWriter(self.video_filename, self.video_writer, self.fps, self.frameSize)
self.frame_counts = 1
self.start_time = time.time()


# Video starts being recorded
def record(self):

# counter = 1
timer_start = time.time()
timer_current = 0


while(self.open==True):
ret, video_frame = self.video_cap.read()
if (ret==True):

self.video_out.write(video_frame)
# print str(counter) + " " + str(self.frame_counts) + " frames written " + str(timer_current)
self.frame_counts += 1
# counter += 1
# timer_current = time.time() - timer_start
time.sleep(0.16)
# gray = cv2.cvtColor(video_frame, cv2.COLOR_BGR2GRAY)
# cv2.imshow('video_frame', gray)
# cv2.waitKey(1)
else:
break

# 0.16 delay -> 6 fps
#


# Finishes the video recording therefore the thread too
def stop(self):

if self.open==True:

self.open=False
self.video_out.release()
self.video_cap.release()
cv2.destroyAllWindows()

else:
pass


# Launches the video recording function using a thread
def start(self):
video_thread = threading.Thread(target=self.record)
video_thread.start()





class AudioRecorder():


# Audio class based on pyAudio and Wave
def __init__(self):

self.open = True
self.rate = 44100
self.frames_per_buffer = 1024
self.channels = 2
self.format = pyaudio.paInt16
self.audio_filename = "temp_audio.wav"
self.audio = pyaudio.PyAudio()
self.stream = self.audio.open(format=self.format,
channels=self.channels,
rate=self.rate,
input=True,
frames_per_buffer = self.frames_per_buffer)
self.audio_frames = []


# Audio starts being recorded
def record(self):

self.stream.start_stream()
while(self.open == True):
data = self.stream.read(self.frames_per_buffer)
self.audio_frames.append(data)
if self.open==False:
break


# Finishes the audio recording therefore the thread too
def stop(self):

if self.open==True:
self.open = False
self.stream.stop_stream()
self.stream.close()
self.audio.terminate()

waveFile = wave.open(self.audio_filename, 'wb')
waveFile.setnchannels(self.channels)
waveFile.setsampwidth(self.audio.get_sample_size(self.format))
waveFile.setframerate(self.rate)
waveFile.writeframes(b''.join(self.audio_frames))
waveFile.close()

pass

# Launches the audio recording function using a thread
def start(self):
audio_thread = threading.Thread(target=self.record)
audio_thread.start()





def start_AVrecording(filename):

global video_thread
global audio_thread

video_thread = VideoRecorder()
audio_thread = AudioRecorder()

audio_thread.start()
video_thread.start()

return filename




def start_video_recording(filename):

global video_thread

video_thread = VideoRecorder()
video_thread.start()

return filename


def start_audio_recording(filename):

global audio_thread

audio_thread = AudioRecorder()
audio_thread.start()

return filename




def stop_AVrecording(filename):

audio_thread.stop()
frame_counts = video_thread.frame_counts
elapsed_time = time.time() - video_thread.start_time
recorded_fps = frame_counts / elapsed_time
print "total frames " + str(frame_counts)
print "elapsed time " + str(elapsed_time)
print "recorded fps " + str(recorded_fps)
video_thread.stop()

# Makes sure the threads have finished
while threading.active_count() > 1:
time.sleep(1)


# Merging audio and video signal

if abs(recorded_fps - 6) >= 0.01: # If the fps rate was higher/lower than expected, re-encode it to the expected

print "Re-encoding"
cmd = "ffmpeg -r " + str(recorded_fps) + " -i temp_video.avi -pix_fmt yuv420p -r 6 temp_video2.avi"
subprocess.call(cmd, shell=True)

print "Muxing"
cmd = "ffmpeg -ac 2 -channel_layout stereo -i temp_audio.wav -i temp_video2.avi -pix_fmt yuv420p " + filename + ".avi"
subprocess.call(cmd, shell=True)

else:

print "Normal recording\nMuxing"
cmd = "ffmpeg -ac 2 -channel_layout stereo -i temp_audio.wav -i temp_video.avi -pix_fmt yuv420p " + filename + ".avi"
subprocess.call(cmd, shell=True)

print ".."




# Required and wanted processing of final files
def file_manager(filename):

local_path = os.getcwd()

if os.path.exists(str(local_path) + "/temp_audio.wav"):
os.remove(str(local_path) + "/temp_audio.wav")

if os.path.exists(str(local_path) + "/temp_video.avi"):
os.remove(str(local_path) + "/temp_video.avi")

if os.path.exists(str(local_path) + "/temp_video2.avi"):
os.remove(str(local_path) + "/temp_video2.avi")

if os.path.exists(str(local_path) + "/" + filename + ".avi"):
os.remove(str(local_path) + "/" + filename + ".avi")

关于python - 如何从相机(或网络摄像头)在 python 中捕获视频(和音频),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14140495/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com