使用Pyaudio暂停录音

时间:2019-05-16 01:38:35

标签: python pyaudio

大家好,我擅长使用PyAudio库开发项目,也使用网络摄像头捕获视频,当时我设法将视频和音频记录在两个单独的文件中,但是当用户暂停录制,然后继续该过程,视频存储没有问题,但仅录制音频,直到给出暂停信号为止。

虽然用户没有同时将视频与音频文件和视频进行匹配,但我的问题是如何暂停音频记录然后恢复它,希望有人能帮助我附加我的工作代码

import cv2
import numpy as np
from datetime import datetime
import gtk
import keyboard

import pyaudio
import wave
import sys

flagrecord=True
chunk = 1024
FORMAT = pyaudio.paInt16
CHANNELS = 1
RATE = 44100


def show_webcam(flagrecord):

    cam = cv2.VideoCapture(0)
    fourcc = cv2.VideoWriter_fourcc(*'XVID')
    frame_width = int(cam.get(3))
    frame_height = int(cam.get(4))
    FONT = cv2.FONT_HERSHEY_PLAIN
    filename = datetime.now().strftime("%Y-%m-%d_%H.%M.%S") + ".avi"
    filenamea = datetime.now().strftime("%Y-%m-%d_%H.%M.%S") 

    p = pyaudio.PyAudio()
    stream = p.open(format = FORMAT,
                    channels = CHANNELS,
                    rate = RATE,
                    input = True,
                    frames_per_buffer = chunk)
    all = []

    out = cv2.VideoWriter(filename,fourcc, 30, (frame_width,frame_height))

    while True:

        ret_val, img = cam.read()
        title = datetime.now().strftime("%Y-%m-%d*%H:%M:%S")

        if flagrecord: 

            img = cv2.flip(img,1)
            cv2.putText(img, "REC", (40,40), FONT, 3 , (0,0,255), 2)
            cv2.circle(img, (20,20), 10 , (0,0,255), -1)
            cv2.rectangle(img, (30,430),(600,480),(0,0,0), -1)
            cv2.putText(img, title, (40,470), FONT, 3 , (255,255,255), 2)
            cv2.imshow('Grabacion de Audiencias', img)
            out.write(img)

            stream.start_stream()
            data = stream.read(chunk)
            all.append(data)

        else:

            img = cv2.flip(img,1)
            cv2.putText(img, "PAUSE", (40,40), FONT, 3 , (255,0,0), 2)
            cv2.circle(img, (20,20), 10 , (255,0,0), -1)
            cv2.rectangle(img, (50,430),(570,480),(0,0,0), -1)
            cv2.putText(img, "Audiencias En Pausa", (60,470), FONT, 3 , (255,255,255), 2)
            cv2.imshow('Grabacion de Audiencias', img)
            stream.stop_stream()

        if cv2.waitKey(1) == 27: 
            break  
        if keyboard.is_pressed('p'):
            flagrecord=False
        if keyboard.is_pressed('c'):
            flagrecord=True 
        if keyboard.is_pressed('q'):
            break     

    cam.release()        
    out.release()        
    cv2.destroyAllWindows()

    data = ''.join(all)
    wf = wave.open(filenamea, 'wb')
    wf.setnchannels(CHANNELS)
    wf.setsampwidth(p.get_sample_size(FORMAT))
    wf.setframerate(RATE)
    wf.writeframes(data)
    wf.close()


def main():
    show_webcam(mirror=True)


if __name__ == '__main__':
    main()

1 个答案:

答案 0 :(得分:0)

大家好,我设法暂停音频并继续播放视频,我有2秒的延迟,但是我认为这是改善解决方案代码附件中的帧的问题

完整代码

import cv2
import numpy as np
from datetime import datetime
import gtk
import keyboard

import pyaudio
import wave
import sys

flagrecord=True
#chunk = 1024
FORMAT = pyaudio.paInt16
CHANNELS = 1
RATE = 44100
ropen=True
chunk = int(RATE/20) 


def show_webcam(flagrecord):

    cam = cv2.VideoCapture(0)
    fourcc = cv2.VideoWriter_fourcc(*'XVID')
    frame_width = int(cam.get(3))
    frame_height = int(cam.get(4))
    FONT = cv2.FONT_HERSHEY_PLAIN
    filename = datetime.now().strftime("%Y-%m-%d_%H.%M.%S") + ".avi"
    filenamea = datetime.now().strftime("%Y-%m-%d_%H.%M.%S") 


    p = pyaudio.PyAudio()
    stream = p.open(format = FORMAT,
                    channels = CHANNELS,
                    rate = RATE,
                    input = True,
                    frames_per_buffer = chunk)

    out = cv2.VideoWriter(filename,fourcc, 20, (frame_width,frame_height))

    all = []
    aux = []
    stream.start_stream()

    flagaudio=False

    while True:

        ret_val, img = cam.read()
        title = datetime.now().strftime("%Y-%m-%d*%H:%M:%S")

        if flagrecord: 

            img = cv2.flip(img,1)
            cv2.putText(img, "REC", (40,40), FONT, 3 , (0,0,255), 3)
            cv2.circle(img, (20,20), 10 , (0,0,255), -1)
            cv2.rectangle(img, (30,430),(600,480),(0,0,0), -1)
            cv2.putText(img, title, (40,470), FONT, 3 , (255,255,255), 2)
            cv2.imshow('Grabacion de Audiencias', img)
            data = stream.read(chunk)
            aux.append(data)
            out.write(img)

        else:

            img = cv2.flip(img,1)
            cv2.putText(img, "PAUSE", (40,40), FONT, 3 , (255,0,0), 3)
            cv2.circle(img, (20,20), 10 , (255,0,0), -1)
            cv2.rectangle(img, (50,430),(570,480),(0,0,0), -1)
            cv2.putText(img, "Audiencias En Pausa", (60,470), FONT, 3 , (255,0,0), 2)
            cv2.imshow('Grabacion de Audiencias', img)

            if flagaudio:
               all+=aux
               del  aux[:]
               data= 0
               stream.stop_stream()
            else:
               pass


        q=cv2.waitKey(1)
        if q == 27:
            break  
        if q == ord('p'):
            flagrecord=False
            flagaudio = True
        if q == ord('c'):
            flagrecord=True
            flagaudio=False
            stream.start_stream()
        if q == ord('q'):
            break  

    cam.release()        
    out.release()        
    cv2.destroyAllWindows()

    stream.close()
    p.terminate()
    all+=aux
    data = ''.join(all)
    wf = wave.open(filenamea, 'wb')
    wf.setnchannels(CHANNELS)
    wf.setsampwidth(p.get_sample_size(FORMAT))
    wf.setframerate(RATE)
    wf.writeframes(data)
    wf.close()




def main():
    show_webcam(mirror=True)


if __name__ == '__main__':
    main()

第一步

flagrecord=True
#chunk = 1024
FORMAT = pyaudio.paInt16
CHANNELS = 1
RATE = 44100
ropen=True
chunk = int(RATE/20) 

变量块必须除以RATE / 20,其中20是帧数,因为我们要连续记录并且时间没有限制

我在这篇文章中找到了解决方案

Continuesly streaming audio signal real time infinitely, Python

第二步

all = []
aux = []
stream.start_stream()
flagaudio=False

我们创建一个lita aux start stream.start_stream()并创建变量flagaudio = False,该变量以false开头,这样它就不会在第一个周期内进入

第三步

if flagrecord: 

            img = cv2.flip(img,1)
            cv2.putText(img, "REC", (40,40), FONT, 3 , (0,0,255), 3)
            cv2.circle(img, (20,20), 10 , (0,0,255), -1)
            cv2.rectangle(img, (30,430),(600,480),(0,0,0), -1)
            cv2.putText(img, title, (40,470), FONT, 3 , (255,255,255), 2)
            cv2.imshow('Grabacion de Audiencias', img)
            data = stream.read(chunk)
            aux.append(data)
            out.write(img)

        else:

            img = cv2.flip(img,1)
            cv2.putText(img, "PAUSE", (40,40), FONT, 3 , (255,0,0), 3)
            cv2.circle(img, (20,20), 10 , (255,0,0), -1)
            cv2.rectangle(img, (50,430),(570,480),(0,0,0), -1)
            cv2.putText(img, "Audiencias En Pausa", (60,470), FONT, 3 , (255,0,0), 2)
            cv2.imshow('Grabacion de Audiencias', img)

            if flagaudio:
               all+=aux
               del  aux[:]
               data= 0
               stream.stop_stream()
            else:
               pass

在flagrecord内,如果视频转为false时暂停了视频,则放置条件以询问flagaudio变量是否为true,如果这是列表列表全部采用aux值,则删除列表,因此为了安全起见,在下一个周期它将采用音频的新值。据说数据变量的值为0并使用stream.stop_stream()我们停止音频的记录

第四步

q=cv2.waitKey(1)
        if q == 27:
            break  
        if q == ord('p'):
            flagrecord=False
            flagaudio = True
        if q == ord('c'):
            flagrecord=True
            flagaudio=False
            stream.start_stream()
        if q == ord('q'):
            break  

使用q = cv2.waitKey(1),我们控制暂停顺序(字母p),连续录制(字母c)音频和视频以及退出(字母q),在每种顺序中,我们指示变量标志为我们创建它们以便允许或不允许进入控制条件之一

结束

cam.release()        
    out.release()        
    cv2.destroyAllWindows()

    stream.close()
    p.terminate()
    all+=aux
    data = ''.join(all)
    wf = wave.open(filenamea, 'wb')
    wf.setnchannels(CHANNELS)
    wf.setsampwidth(p.get_sample_size(FORMAT))
    wf.setframerate(RATE)
    wf.writeframes(data)
    wf.close()

我们完成了视频和音频的录制过程,并关闭了网络摄像头。

此刻,我只听到了三秒钟的音频丢失,但暂停和继续录制的主要内容正确地工作了,我认为我的失败在于帧和循环的控制。

我希望我的解决方案能对您有所帮助并给出解释