2016-04-01 14 views
0

Ich arbeite an einem Tensorflow-Projekt, das von einem Audio-Stream lernt. Ich verwende das Unterprozessmodul (mit Popen) und FFMPEG, um die Audiodaten von einem mp3 einzulesen. Ich öffne erfolgreich die Audiodatei mit Popen() und ich kann die Ausgabe durch stdout drucken. Ich kann es jedoch nicht erfassen.Python Capture Subprozess Ausgabe

Ich habe beide versucht read() und communicate()

Ich folge ein Tutorial here

read() einfach nichts zurück und communicate() führt den Fehler: AttributeError: 'file' object has no attribute 'communicate'

Hier ist mein Code:

for image_index, image in enumerate(image_files): 
    count += 1 
    image_file = os.path.join(folder, image) 
    try: 
    output_files = "output/output" + str(count) + ".png" 
    if image_file != 'train/rock/.DS_Store': 
     command = [FFMPEG_BIN, 
      '-i', image_file, 
      '-f', 's16le', 
      '-acodec', 'pcm_s16le', 
      '-ar', '44100', 
      '-ac', '2', 
      output_files] 
     pipe = sp.Popen(command, stdout=sp.PIPE) 
     print (pipe) 
     raw_audio = pipe.stdout.communicate(88200*4) 

Ich habe alles versucht here und here

Antwort

4

Die Popen Objekt hat nicht stdout kommunizieren:

pipe.communicate(str(88200*4)) 

Um auch stderr durch stdout zu erfassen:

pipe = sp.Popen(command, stdout=sp.PIPE, stderr=sp.STDOUT, stdin=sp.PIPE) 
raw_audio, _ = pipe.communicate(str(88200*4).encode()) 
print(raw_audio) 
+0

Vielen Dank! Ich schlug mit dem Kopf gegen eine Wand, und natürlich ist es etwas Einfaches. Gibt es einen Grund, warum der 'print (raw_audio)' '('', None)' '' '' '' –

+1

@KendallWeihe, versuchen, 'stderr = sp.STDOUT' –

+0

zu' Popen' hinzuzufügen? Jetzt dreht es sich gerade mit dieser als die letzte Ausgabe '' –