pyaudio音频录制及基础音频知识理解

Posted 填坑mona

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了pyaudio音频录制及基础音频知识理解相关的知识,希望对你有一定的参考价值。

最近接到一个需求,需要准备大量的音频,其中需要自己录制的音频进行处理。

Python模块:PyAudio  PyAudio · PyPI

安装方法: pipwin install pyaudio 

注:pipwin 安装时有时会因为网络超时,导致安装失败。可以更换安装源。

可参考: pip安装python包报错的一些解决办法【转】_yuhushangwei的博客-CSDN博客

录制音频基础代码如下:

    def audio_record(slef, file_name, rec_time):
        chunk = 1024
        formate = pyaudio.paInt16   #16bit编码格式(2个字节)
        channels = 1    #单声道
        rate = 16000  #采样率

        p = pyaudio.PyAudio()

        stream = p.open(format = formate,
                        channels= channels,
                        rate =rate,
                        input= True,
                        frames_per_buffer=chunk)

        print("开始录制")

        #录制的音频数据
        frames = []

        for i in range(0, int(rate / chunk * rec_time)):
            data = stream.read(chunk)
            frames.append(data)

        #录制完成
        stream.stop_stream()
        stream.close()
        p.terminate()

        print("完成录制")

        # wave是录音时用的标准的WINDOWS文件格式,文件的扩展名为WAV
        # 保存录音
        file = wave.open(file_name, "wb")
        file.setnchannels(channels)
        file.setsampwidth(p.get_sample_size(formate))   #或者sampwidth=2(2个字节16位);  file.setsampwidth(sampwidth)
        file.setframerate(rate)  #帧速率
        file.writeframes(b''.join(frames))   #把数据加进去,存到硬盘中
        file.close()

音频相关理解:

现实生活中,我们听到的声音都是时间连续的,我们称为这种信号叫模拟信号。模拟信号需要进行数字化以后才能在计算机中使用。

声音处理过程:

采样(将下图中一段音频模拟信息信号转换为数字信号)---->   量化(每个样本的大小)---->  二进制编码

采样率rate: 

采样率:1s采集多少次声音,也是所得的数字信号的每秒样本数。采样率越高,声音的还原就越真实自然,但同时它占的资源比较多。常见有 16000、44100

采样位数formate:

而采样位数是指声卡在播放时所使用数字信号的二进制位数,代表声卡处理声音的解析度,客观地反映了数字信号对输入信号描述的准确程度。

简单来讲,就是代表每个采样点(上图中小红点)的大小。一般有8,16可选, 这个数值越大,解析度就越高,声音越真实。

8位代表2的8次方——256,16位则代表2的16次方——64K。比较一下,一段相同的音乐信息

16位声卡能把它分为64K个精度单位进行处理,而8位声卡只能处理256个精度单位,这会造成较

大的信号损失,所以最终的采样效果自然是采样位数越高越好

帧frame per buffer:

音频在量化得到二进制的码字后,需要进行变换,而变换是以块为单位(block)进行的,一个块由多个(120或128)样本组成。而一帧内会包含一个或者多个块。帧的常见大小有960、1024、2048、4096等。一帧记录了一个声音单元,它的长度是样本长度和声道数的乘积。不同的编码方式帧不同,比如AAC规定1024采样sample,mp3为1152采样。

比如:

一个AAC原始帧包含一段时间内1024个采样及相关数据

假如:音频总时长为5s

一个音频帧的时间 = 一个AAC帧对应的采样样本的个数/采样频率

                              = 1024 / 16000 * 1000 = 64ms

音频总帧数  =  音频总时长time /  一个音频帧的时间  = 5000 / 64 =78.125

音频总帧数 =  采样率rate * 音频总时长time / 帧 frame per buffer

                   =  音频总采样数 / 每帧采样数

                    =  16000  *  5  / 1024 = 78.125

单位: 秒

使用PYaudio录制音频和视频(自己)

参考:https://blog.csdn.net/zhaoyun_zzz/article/details/84341801

音频录制:简洁版

import pyaudio
import wave
import time
import sys

CHUNK = 1024
FORMAT = pyaudio.paInt16
CHANNELS = 2
RATE = 44100
RECORD_SECONDS = 5000
WAVE_OUTPUT_FILENAME = "output.wav"

p = pyaudio.PyAudio()
wf = wave.open(WAVE_OUTPUT_FILENAME, ‘wb‘)
wf.setnchannels(CHANNELS)
wf.setsampwidth(p.get_sample_size(FORMAT))
wf.setframerate(RATE)

time_count = 0
def callback(in_data, frame_count, time_info, status):
wf.writeframes(in_data)
if(time_count < 10):
return (in_data, pyaudio.paContinue)
else:
return (in_data, pyaudio.paComplete)

stream = p.open(format=p.get_format_from_width(wf.getsampwidth()),
channels=wf.getnchannels(),
rate=wf.getframerate(),
input=True,
stream_callback=callback)

stream.start_stream()
print("* recording")
while stream.is_active():
time.sleep(1)
time_count += 1

stream.stop_stream()
stream.close()
wf.close()
p.terminate()
print("* recording done!")


视频录制(无声音版本):

from PIL import ImageGrab
import numpy as np
import cv2

image = ImageGrab.grab()#获得当前屏幕
width = image.size[0]
height = image.size[1]
print("width:", width, "height:", height)
print("image mode:",image.mode)
k=np.zeros((width,height),np.uint8)
fourcc = cv2.VideoWriter_fourcc(*‘XVID‘)#编码格式
video = cv2.VideoWriter(‘test.avi‘, fourcc, 25, (width, height))
#输出文件命名为test.mp4,帧率为16,可以自己设置
while True:
img_rgb = ImageGrab.grab()
img_bgr=cv2.cvtColor(np.array(img_rgb), cv2.COLOR_RGB2BGR)#转为opencv的BGR格式
video.write(img_bgr)
cv2.imshow(‘imm‘, img_bgr)
if cv2.waitKey(1) & 0xFF == ord(‘q‘):
break
video.release()
cv2.destroyAllWindows()

音频与视频结婚:(一定记住此中的MOVIEPY==1.0.0)

 

import wave
# import PyAudio as pyaudio
import pyaudio

# from pyaudio import pyAudio,paInt16
from PIL import ImageGrab
import numpy as np
import cv2
from moviepy.editor import *
from moviepy.audio.fx import all
import time

CHUNK = 1024
FORMAT = pyaudio.paInt16
CHANNELS = 2
RATE = 44100
WAVE_OUTPUT_FILENAME = "output.wav"

p = pyaudio.PyAudio()
wf = wave.open(WAVE_OUTPUT_FILENAME, ‘wb‘)
wf.setnchannels(CHANNELS)
wf.setsampwidth(p.get_sample_size(FORMAT))
wf.setframerate(RATE)
audio_record_flag = True
def callback(in_data, frame_count, time_info, status):
wf.writeframes(in_data)
if audio_record_flag:
return (in_data, pyaudio.paContinue)
else:
return (in_data, pyaudio.paComplete)
stream = p.open(format=p.get_format_from_width(wf.getsampwidth()),
channels=wf.getnchannels(),
rate=wf.getframerate(),
input=True,
stream_callback=callback)
image = ImageGrab.grab()#获得当前屏幕
width = image.size[0]
height = image.size[1]
print("width:", width, "height:", height)
print("image mode:",image.mode)
k=np.zeros((width,height),np.uint8)

fourcc = cv2.VideoWriter_fourcc(*‘XVID‘)#编码格式
video = cv2.VideoWriter(‘test.mp4‘, fourcc, 9.5, (width, height))
#经实际测试,单线程下最高帧率为10帧/秒,且会变动,因此选择9.5帧/秒
#若设置帧率与实际帧率不一致,会导致视频时间与音频时间不一致

print("video recording!!!!!")
stream.start_stream()
print("audio recording!!!!!")
record_count = 0
while True:
img_rgb = ImageGrab.grab()
img_bgr=cv2.cvtColor(np.array(img_rgb), cv2.COLOR_RGB2BGR)#转为opencv的BGR格式
video.write(img_bgr)
record_count += 1
if(record_count > 200):
break
print(record_count, time.time())

audio_record_flag = False
while stream.is_active():
time.sleep(1)

stream.stop_stream()
stream.close()
wf.close()
p.terminate()
print("audio recording done!!!!!")

video.release()
cv2.destroyAllWindows()
print("video recording done!!!!!")

print("video audio merge!!!!!")

#音频和视频切片
audioclip = AudioFileClip("output.wav")
videoclip = VideoFileClip("test.mp4")


videoclip2 = videoclip.set_audio(audioclip)
video = CompositeVideoClip([videoclip2])
video.write_videofile("test2.mp4",codec=‘mpeg4‘)

 

以上是关于pyaudio音频录制及基础音频知识理解的主要内容,如果未能解决你的问题,请参考以下文章

使用 opencv 和 pyaudio 从网络摄像头录制视频和音频

使用 Pyaudio 在 Python 中录制音频,错误 ||PaMacCore (AUHAL)|| ... msg=音频单元:在当前上下文中无法执行

Python 调用pyaudio库录制以及播放wav音频文件

使用 OpenCV 和 PyAudio 同步音频和视频

Python+opencv+pyaudio实现带声音屏幕录制

如何在python中合并音频和视频