Advertisement
Guest User

Untitled

a guest
Apr 20th, 2019
118
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.06 KB | None | 0 0
  1. import pyaudio #録音機能を使うためのライブラリ
  2. import wave #wavファイルを扱うためのライブラリ
  3. import datetime
  4. import numpy as np
  5. import cv2
  6. import datetime
  7. import concurrent.futures
  8. import ffmpeg
  9. from pprint import pprint
  10.  
  11. def recordSound(outputFileName, recordSeconds=10):
  12. WAVE_OUTPUT_FILENAME = outputFileName #音声を保存するファイル名
  13. iDeviceIndex = 0 #録音デバイスのインデックス番号
  14.  
  15. #基本情報の設定
  16. FORMAT = pyaudio.paInt16 #音声のフォーマット
  17. CHANNELS = 1 #モノラル
  18. RATE = 44100 #サンプルレート
  19. CHUNK = 2**11 #データ点数
  20. audio = pyaudio.PyAudio() #pyaudio.PyAudio()
  21.  
  22. startTime = datetime.datetime.now()
  23. stream = audio.open(format=FORMAT, channels=CHANNELS,
  24. rate=RATE, input=True,
  25. input_device_index = iDeviceIndex, #録音デバイスのインデックス番号
  26. frames_per_buffer=CHUNK)
  27.  
  28. #--------------録音開始---------------
  29.  
  30. print ("recording...")
  31. frames = []
  32. for i in range(0, int(RATE / CHUNK * recordSeconds)):
  33. data = stream.read(CHUNK)
  34. frames.append(data)
  35.  
  36.  
  37. print ("finished recording")
  38.  
  39. #--------------録音終了---------------
  40.  
  41. stream.stop_stream()
  42. stream.close()
  43. audio.terminate()
  44.  
  45. waveFile = wave.open(WAVE_OUTPUT_FILENAME, 'wb')
  46. waveFile.setnchannels(CHANNELS)
  47. waveFile.setsampwidth(audio.get_sample_size(FORMAT))
  48. waveFile.setframerate(RATE)
  49. waveFile.writeframes(b''.join(frames))
  50. waveFile.close()
  51.  
  52. return startTime
  53.  
  54. def recordVideo(outputFileName, recordSeconds=10):
  55. cap = cv2.VideoCapture(0)
  56.  
  57. ret, frame = cap.read()
  58. if ret==True:
  59. frame = cv2.flip(frame,0)
  60.  
  61. # Define the codec and create VideoWriter object
  62. fourcc = cv2.VideoWriter_fourcc(*'XVID')
  63. out = cv2.VideoWriter(outputFileName ,fourcc, 30.0, (frame.shape[1],frame.shape[0]))
  64.  
  65. startDateTime = None
  66. startTime = datetime.datetime.now()
  67. previous = None
  68. while(cap.isOpened()):
  69. now = datetime.datetime.now()
  70. if (now - startTime).total_seconds() >= recordSeconds:
  71. break
  72.  
  73. if previous is None:
  74. previous = now - datetime.timedelta(seconds=1/30)
  75.  
  76. td = now - previous
  77. if td.total_seconds() < 1/30:
  78. print("無視")
  79. continue
  80.  
  81. for i in range(int(td.total_seconds() / (1/ 30)) - 1):
  82. print("埋め合わせ")
  83. out.write(frame)
  84.  
  85. ret, frame = cap.read()
  86. startDateTime = datetime.datetime.now() if startDateTime is None else startDateTime
  87. if ret==True:
  88. frame = cv2.flip(frame,0)
  89. out.write(frame)
  90. previous = now
  91. else:
  92. raise Exception("hoge")
  93.  
  94.  
  95. # Release everything if job is finished
  96. cap.release()
  97. out.release()
  98.  
  99. return startDateTime
  100.  
  101. def merge(soundFileName,soundStartTime, videoFileName, videoStartTime, length, outputFileName):
  102. dt = (videoStartTime - soundStartTime).total_seconds()
  103. # ffmpeg.input(soundFileName).output("temp.aac", ss=dt, t=length, **{"c:v":"aac"}).run()
  104. # ffmpeg.input(videoFileName).output("temp.mp4", ss=0, t=length, **{"c:v":"h264"}).run()
  105.  
  106. ffmpeg.output(
  107. ffmpeg.input(videoFileName, ss=0)["v"],
  108. ffmpeg.input(soundFileName, ss=dt)["a"],
  109. outputFileName, t=length).run()
  110. # print(dt)
  111. # pprint(ffmpeg.probe("temp.mp4"))
  112. # pprint(ffmpeg.probe("temp.aac"))
  113. # pprint(ffmpeg.probe("output.mp4"))
  114.  
  115. if __name__ == "__main__":
  116. # print(ffmpeg.probe("output.mp4"))
  117. # # print(ffmpeg.probe("temp.aac"))
  118. # # print(ffmpeg.probe("temp.mp4"))
  119. executor = concurrent.futures.ProcessPoolExecutor(max_workers=4)
  120. future1 = executor.submit(recordSound, "sound.wav", 60)
  121. future2 = executor.submit(recordVideo, "video.avi", 60)
  122.  
  123. soundStartTime = future1.result()
  124. videoStartTime = future2.result()
  125.  
  126. executor.submit(merge, "sound.wav",soundStartTime, "video.avi", videoStartTime, 59, "output2.mp4").result()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement