【问题标题】:Pause recording with Pyaudio使用 Pyaudio 暂停录制
【发布时间】:2019-05-16 01:38:34
【问题描述】:

大家好我擅长使用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()

【问题讨论】:

    标签: python pyaudio


    【解决方案1】:

    大家好,我设法暂停了音频并继续播放视频我有 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()
    

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

    此时,确切地说,只有三秒钟的音频丢失,但暂停和继续录制的主要内容正常工作,我认为我的失败在于对帧和周期的控制。

    我希望我的解决方案和给出的解释会有所帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-22
      • 2015-09-21
      • 1970-01-01
      • 2014-12-21
      相关资源
      最近更新 更多