• win录制内部声音


    import wave
    import threading
    from os import remove, mkdir, listdir
    from os.path import exists, splitext, basename, join
    from datetime import datetime
    from time import sleep
    from shutil import rmtree
    import pyaudio
    from PIL import ImageGrab
    from moviepy.editor import *
    
    CHUNK_SIZE = 1024
    CHANNELS = 2
    FORMAT = pyaudio.paInt16
    RATE = 48000
    allowRecording = True
    
    def findInternalRecordingDevice(self,p):
    	#要找查的设备名称中的关键字
    	target = '立体声混音'
    	#逐一查找声音设备  
    	for i in range(p.get_device_count()):
    		devInfo = p.get_device_info_by_index(i)   
    		if devInfo['name'].find(target)>=0 and devInfo['hostApi'] == 0 :      
    			#print('已找到内录设备,序号是 ',i)
    			return i
    	print('无法找到内录设备!')
    	return -1
    
    def record_audio():
    	p = pyaudio.PyAudio()
    	# 创建输入流
    	dev_idx = findInternalRecordingDevice(p)
    	if dev_idx < 0 :            
    		return
    	stream = p.open(input_device_index=dev_idx,format=FORMAT, channels=CHANNELS,
    					rate=RATE, input=True,
    					frames_per_buffer=CHUNK_SIZE)
    	wf = wave.open(audio_filename, 'wb')
    	wf.setnchannels(CHANNELS)
    	wf.setsampwidth(p.get_sample_size(FORMAT))
    	wf.setframerate(RATE)
    	while allowRecording:
    		# 从录音设备读取数据,直接写入wav文件
    		data = stream.read(CHUNK_SIZE)
    		wf.writeframes(data)
    	wf.close()
    	stream.stop_stream()
    	stream.close()
    	p.terminate()
    
    
    def record_screen():
    	index = 1
    	while allowRecording:
    		ImageGrab.grab().save(f'{pic_dir}{index}.jpg',
    							quality=95, subsampling=0)
    		sleep(0.04)
    		index = index + 1
    
    
    audio_filename = str(datetime.now())[:19].replace(':', '_') + '.mp3'
    pic_dir = 'pics'
    if not exists(pic_dir):
    	mkdir(pic_dir)
    # video_filename = audio_filename[:-3] + 'avi'
    video_filename = audio_filename[:-3] + 'mp4'
    # 创建两个线程,分别录音和录屏
    t1 = threading.Timer(3, record_audio)
    t2 = threading.Timer(3, record_screen)
    t1.start()
    t2.start()
    print('3秒后开始录制,按q键结束录制')
    while (ch := input()) != 'q':
    	pass
    allowRecording = False
    t1.join()
    t2.join()
    
    # 把录制的音频和屏幕截图合成为视频文件
    audio = AudioFileClip(audio_filename)
    pic_files = [join(pic_dir, fn) for fn in listdir(pic_dir)
    			if fn.endswith('.jpg')]
    # 按文件名编号升序排序
    pic_files.sort(key=lambda fn: int(splitext(basename(fn))[0]))
    # 计算每个图片的显示时长
    each_duration = round(audio.duration / len(pic_files), 4)
    # 连接多个图片
    image_clips = []
    for pic in pic_files:
    	image_clips.append(ImageClip(pic,
    								duration=each_duration))
    video = concatenate_videoclips(image_clips)
    video = video.set_audio(audio)
    video.write_videofile(video_filename, codec='mpeg4', fps=25)
    # 删除临时音频文件和截图
    remove(audio_filename)
    rmtree(pic_dir)
    
  • 相关阅读:
    DEDECMS5.5/5.6/5.7列表页调用TAG标签(热门标签)的两种方法
    DEDE列表页和内容页调用顶级栏目ID的方法
    解决dede图集上传图片时跳出302错误
    DEDE用{dede:sql}标签取出当前文档的附加表中的内容
    DEDE模板中如何运行php脚本和php变量的使用
    织梦DEDECMS {dede:arclist},{dede:list}获取附加表字段内容
    把DEDE的在线文本编辑器换成Kindeditor不显示问题
    ExtJS:文件上传实例
    ExtJS:GridPanel之renderer:function()和itemdblclick : function()方法参数详解
    ExtJS:菜单ComboBox及级联菜单应用
  • 原文地址:https://www.cnblogs.com/bear-king/p/15132537.html
Copyright © 2020-2023  润新知