import pyaudio
import cv2
import subprocess
import wave
from platform import release
# Set up PyAudio
p = pyaudio.PyAudio()
# Set up OpenCV
cap = cv2.VideoCapture(0)
# 音频采样率
sample_rate = 16000
# fps
frame_rate = 15.625
# 打开pyaudio流录制音频
audio_stream = p.open(format=pyaudio.paInt16,
channels=1,
rate=sample_rate,
frames_per_buffer=1024,
input=True)
# 设置视频的FourCC代码和帧大小
fourcc = cv2.VideoWriter_fourcc(*'XVID')
frame_size = (640, 480)
# 创建一个VideoWriter对象来保存视频
video_writer = cv2.VideoWriter('b.mp4', fourcc, frame_rate, frame_size)
audio_data = []
# 开始循环录制
while True:
# 显示摄像头
ret, frame = cap.read()
if ret:
# 将视频帧保存到视频文件
video_writer.write(frame)
cv2.imshow('Camera', frame)
# 从麦克风读取音频数据并将其附加到audio_data变量
audio = audio_stream.read(1024)
audio_data.append(audio)
# 如果用户按下'q'键,则打破循环
if cv2.waitKey(1) & 0xFF == ord('q'):
cap.release()
# 释放摄像头资源
video_writer.release()
# 关闭录像窗口
cv2.destroyAllWindows()
# 释放音频资源
audio_stream.stop_stream()
audio_stream.close()
p.terminate()
break
else:
break
# 保存音频文件为wav
wf = wave.open('a.wav', 'wb')
wf.setnchannels(1)
wf.setsampwidth(p.get_sample_size(pyaudio.paInt16))
wf.setframerate(16000)
wf.writeframes(b''.join(audio_data))
wf.close()
# 合并音频和视频文件
subprocess.run(["ffmpeg", "-i", "b.mp4", "-i", "a.wav", "-c:v", "copy", "-c:a", "aac", "-strict", "experimental", "output.mp4"])
这里需要注意,录制生成的a.wav、b.mp4和最终的output.mp4生成之后,下次运行代码之前要将它们删掉,不然程序一直会处在运行状态。(当然可以在文件名不覆盖的情况下不删除)
参考👉opencv录屏
虽然这一篇写的是录屏,但博主说的调整帧率的方法还是挺好使的。
new_fps = old_fps * (int(Count) / old_fps) / screen_time
我首先使用录制代码录制了一份frame_rate = 24的视频,播放起来速度还是很快,而且合并上音频音画并不同步。
采取上面链接博主的方法,我首先获取frame_rate = 24的视频的帧率和帧数
import cv2
# Open the video file
video = cv2.VideoCapture("b.mp4")
# Get the frame rate and number of frames
frame_rate = video.get(cv2.CAP_PROP_FPS)
frame_count = video.get(cv2.CAP_PROP_FRAME_COUNT)
# Calculate the duration of the video
duration = frame_count / frame_rate
# Print the frame rate, number of frames, and duration
print("Frame rate:", frame_rate)
print("Number of frames:", frame_count)
print("Duration:", duration)
# Release the video file
video.release()
输出:
Frame rate: 24.0
Number of frames: 80.0
Duration: 3.3333333333333335
因为音频录制的时间没有什么问题,速度也没啥问题,所以我采用音频的持续时间作为整段视频原本应该持续的时间
# 获取音频时长
def audio_duration(audio_file):
import wave
with wave.open(audio_file, 'rb') as wav_file:
num_frames = wav_file.getnframes()
frame_rate = wav_file.getframerate()
duration = num_frames / frame_rate
return duration
audio_duration('a.wav')
输出:
5.12
在看之前博主给出的公式 new_fps = old_fps * (int(Count) / old_fps) / screen_time
那么我这里就是new_fps = 24*(80/24)/5.12=15.625
所以,我将录制的代码中frame_rate改为了15.625,最终合成的视频发现音像是同步的。单独生成的音频和视频也会做后续的分析。如果不需要,可以不留着这两个文件,remove即可。
我的邮箱:k1933211129@163.com,CSDN私信很少看,欢迎各位大佬不吝赐教~
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Pythonconditionalassignmentoperator对于这样一个简单的问题表示歉意,但是谷歌搜索||=并不是很有帮助;)Python中是否有与Ruby和Perl中的||=语句等效的语句?例如:foo="hey"foo||="what"#assignfooifit'sundefined#fooisstill"hey"bar||="yeah"#baris"yeah"另外,类似这样的东西的通用术语是什么?条件分配是我的第一个猜测,但Wikipediapage跟我想的不太一样。
什么是ruby的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht
相信很多人在录制视频的时候都会遇到各种各样的问题,比如录制的视频没有声音。屏幕录制为什么没声音?今天小编就和大家分享一下如何录制音画同步视频的具体操作方法。如果你有录制的视频没有声音,你可以试试这个方法。 一、检查是否打开电脑系统声音相信很多小伙伴在录制视频后会发现录制的视频没有声音,屏幕录制为什么没声音?如果当时没有打开音频录制,则录制好的视频是没有声音的。因此,建议在录制前进行检查。屏幕上没有声音,很可能是因为你的电脑系统的声音被禁止了。您只需打开电脑系统的声音,即可录制音频和图画同步视频。操作方法:步骤1:点击电脑屏幕右下侧的“小喇叭”图案,在上方的选项中,选择“声音”。 步骤2:在“声
首先回顾一下拉格朗日定理的内容:函数f(x)是在闭区间[a,b]上连续、开区间(a,b)上可导的函数,那么至少存在一个,使得:通过这个表达式我们可以知道,f(x)是函数的主体,a和b可以看作是主体函数f(x)中所取的两个值。那么可以有, 也就意味着我们可以用来替换 这种替换可以用在求某些多项式差的极限中。方法: 外层函数f(x)是一致的,并且h(x)和g(x)是等价无穷小。此时,利用拉格朗日定理,将原式替换为 ,再进行求解,往往会省去复合函数求极限的很多麻烦。使用要注意:1.要先找到主体函数f(x),即外层函数必须相同。2.f(x)找到后,复合部分是等价无穷小。3.要满足作差的形式。如果是加
华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o
之前在培训新生的时候,windows环境下配置opencv环境一直教的都是网上主流的vsstudio配置属性表,但是这个似乎对新生来说难度略高(虽然个人觉得完全是他们自己的问题),加之暑假之后对cmake实在是爱不释手,且这样配置确实十分简单(其实都不需要配置),故斗胆妄言vscode下配置CV之法。其实极为简单,图比较多所以很长。如果你看此文还配不好,你应该思考一下是不是自己的问题。闲话少说,直接开始。0.CMkae简介有的人到大二了都不知道cmake是什么,我不说是谁。CMake是一个开源免费并且跨平台的构建工具,可以用简单的语句来描述所有平台的编译过程。它能够根据当前所在平台输出对应的m
我想解析一个已经存在的.mid文件,改变它的乐器,例如从“acousticgrandpiano”到“violin”,然后将它保存回去或作为另一个.mid文件。根据我在文档中看到的内容,该乐器通过program_change或patch_change指令进行了更改,但我找不到任何在已经存在的MIDI文件中执行此操作的库.他们似乎都只支持从头开始创建的MIDI文件。 最佳答案 MIDIpackage会为您完成此操作,但具体方法取决于midi文件的原始内容。一个MIDI文件由一个或多个音轨组成,每个音轨是十六个channel中任何一个上的
本文主要介绍在使用Selenium进行自动化测试或者任务时,对于使用了iframe的页面,如何定位iframe中的元素文章目录场景描述解决方案具体代码场景描述当我们在使用Selenium进行自动化测试的时候,可能会遇到一些界面或者窗体是使用HTML的iframe标签进行承载的。对于iframe中的标签,如果直接查找是无法找到的,会抛出没有找到元素的异常。比如近在咫尺的例子就是,CSDN的登录窗体就是使用的iframe,大家可以尝试通过F12开发者模式查看到的tag_name,class_name,id或者xpath来定位中的页面元素,会抛出NoSuchElementException异常。解决
深度学习部署:Windows安装pycocotools报错解决方法1.pycocotools库的简介2.pycocotools安装的坑3.解决办法更多Ai资讯:公主号AiCharm本系列是作者在跑一些深度学习实例时,遇到的各种各样的问题及解决办法,希望能够帮助到大家。ERROR:Commanderroredoutwithexitstatus1:'D:\Anaconda3\python.exe'-u-c'importsys,setuptools,tokenize;sys.argv[0]='"'"'C:\\Users\\46653\\AppData\\Local\\Temp\\pip-instal