Ich bin noch Anfänger, was die Programmierung in Python betrifft, also entschuldigt bitte meinen "Quick & dirty" Code.
Ich möchte ein Art Video-Tagebuch schreiben.
Ablauf:
1. der User drückt die Taste "r" um die Aufnahme zu starten.
2. Es läuft ein 5-Skunden Video mit einem Countdown ab.
3. Die Aufnahme startet und es wird im Aufnahmefenster ein Countdown von 20 Sek. angezeigt.
4. nach der Aufnahme wird ein Video angezeig, das die Aufnahme bestätigt.
Das Ganze funktioniert bereits alles, bis auf die Aufnahme des Tons.
Dazu verwende ich Hauptsächlich das OpenCV Modul.
Leider ist es mit diesem Modul nicht möglich den Sound meiner Webcam aufzunehmen.
Ich stoße momentan an meine Grenzen, was die Programmierung betrifft.
Nun meine Frage:
Wie kann ich den Ton und das Video meiner Webcam gleichzeitig Aufzeichnen, denn ein Video-Tagebuch ohne Ton ist nichts anderes als ein Stummfilm

Code: Alles auswählen
#!/usr/bin/python
# -*- coding: utf-8 -*-
while True:
# Module fuer den Timer und die Kamera laden
from time import time, sleep, localtime
import threading, cv, cv2, sys
# Funktionen definieren
def lifestream():
# Kameraeinstellungen definieren
capture = cv.CaptureFromCAM(0)
fps = 25
w, h = 720, 540
while True:
# Texteinblendung
## Farbdefinition des eingeblendeten Textes
r=0 # Rotwerte
g=255 # Gelbwerte
b=0 # Blauwerte
## Textposition
tx = 40 # X-Position von Links
ty = 40 # Y-Position von Oben
frame = cv.QueryFrame(capture)
font = cv.InitFont(cv.CV_FONT_HERSHEY_COMPLEX, 1, 1, 0, 2, 20)
cv.PutText(frame, "Zur Aufnahme Taste r druecken", (tx,ty),font, (b,g,r))
cv.NamedWindow('capture', 0)
cv.ResizeWindow( "capture", 720, 540 )
cv.ShowImage("capture", frame)
cv.MoveWindow ("capture", 550,400)
key=cv.WaitKey(10)
# Tastatureingaben pruefen
# pruefen ob "r" gedrueckt wurde
if key & 255 == 114:
break
# pruefen ob "ESC" gedrueckt wurde
elif key & 255 == 27:
sys.exit()
# pruefen ob "q" gedrueckt wurde
elif key & 255 == 113:
sys.exit()
def countdown5():
vidFile = cv.CaptureFromFile( 'Countdown.mpg' )
nFrames = int( cv.GetCaptureProperty( vidFile, cv.CV_CAP_PROP_FRAME_COUNT ) )
fps = cv.GetCaptureProperty( vidFile, cv.CV_CAP_PROP_FPS )
waitPerFrameInMillisec = int( 1/fps * 1000/1 )
for f in xrange( nFrames ):
frameImg = cv.QueryFrame( vidFile )
cv.ShowImage( "capture", frameImg )
cv.ResizeWindow( "capture", 720, 540 )
cv.MoveWindow ( "capture", 550,400 )
key = cv.WaitKey( waitPerFrameInMillisec )
if key & 255 == 27:
sys.exit()
def recording():
# Startzeit ermitteln und in lesbaren String umwandeln
zeit = localtime()
s = "%02i:%02i:%02i %02i-%02i-%02i" % (zeit[3],zeit[4],zeit[5],zeit[2],zeit[1],zeit[0])
global fn
fn = "%02i_%02i_%02i__%02i_%02i_%02i" % (zeit[3],zeit[4],zeit[5],zeit[2],zeit[1],zeit[0])
aufnahmezeit=str(s)
# Video-Verzeichis muss mit abschiessendem / abgegeben werden
videodir="./Tagebuchvideos/"
# Kameraeinstellungen definieren
capture = cv.CaptureFromCAM(0)
fourcc = cv.CV_FOURCC('M','J','P','G')
fps = 25
w, h = 720, 540
stream = cv.CreateVideoWriter(videodir + fn + "_Video.avi", fourcc, fps, (w, h))
# Hier wird die Dauer der Aufnahme in Sek. eingestellt
recordingtime = 20
recstart = int(time())
while True:
now = int(time())
recdiff = now - recstart
counter = recdiff - recordingtime
if counter <= 0 :
# hier wir der Timer und die Aufnahme gestartet.
rectime = recordingtime
frame = cv.QueryFrame(capture)
# Videostream schreiben
# Texteinblendung in Datei
## Farbdefinition des eingeblendeten Textes
r=255 # Rotwerte
g=255 # Gelbwerte
b=255 # Blauwerte
## Textposition
tx = 450 # X-Position von Links
ty = 330 # Y-Position von Oben
font = cv.InitFont(cv.CV_FONT_HERSHEY_COMPLEX, .7, .7, 0, 1, 20)
cv.PutText(frame, aufnahmezeit, (ty,tx),font, (b,g,r))
cv.WriteFrame(stream, frame)
## Farbdefinition des eingeblendeten Textes
r=255 # Rotwerte
g=0 # Gelbwerte
b=0 # blauwerte
## Textposition
tx = 450 # X-Position von Links
ty = 50 # Y-Position von Oben
font = cv.InitFont(cv.CV_FONT_HERSHEY_COMPLEX, 2, 2, 0, 4, 20)
cv.PutText(frame, str(counter)[1:], (ty,tx),font, (b,g,r))
# Videofenster anzeigen
cv.ShowImage("capture", frame)
# Fenster positionieren
cv.MoveWindow ("capture", 550,400)
key = cv.WaitKey(10)
if key & 255 == 27:
sys.exit()
else :
break
def confirm_rec():
vidFile = cv.CaptureFromFile( 'VielenDank.mpg' )
nFrames = int( cv.GetCaptureProperty( vidFile, cv.CV_CAP_PROP_FRAME_COUNT ) )
fps = cv.GetCaptureProperty( vidFile, cv.CV_CAP_PROP_FPS )
waitPerFrameInMillisec = int( 1/fps * 1000/1 )
#print 'Num. Frames = ', nFrames
#print 'Frame Rate = ', fps, ' frames per sec'
for f in xrange( nFrames ):
frameImg = cv.QueryFrame( vidFile )
cv.ShowImage( "capture", frameImg )
cv.ResizeWindow( "capture", 720, 576 )
cv.MoveWindow ( "capture", 550, 400 )
key = cv.WaitKey( waitPerFrameInMillisec )
if key & 255 == 27:
sys.exit()
# Ausgabe
lifestream()
countdown5()
recording()
confirm_rec()
Solltet Ihr irgend eine Idee haben, wäre es nett, wenn Ihr es mir verständlich erklären könntet.
Vielen Dank im Voraus
Gruß FK