2014-11-04 26 views
12

Verwandte:Python Extrakt wav aus Videodatei

How to extract audio from a video file using python?

Extract audio from video as wav

How to rip the audio from a video?

Meine Frage ist, wie könnte ich wav-Audiospur aus Video-Datei, sagen video.avi extrahieren? Ich lese viele Artikel und überall schlagen Leute vor, (von Python) ffmpeg als Unterprozess zu verwenden (weil es keine zuverlässigen Pythonbindungen zu ffmpeg gibt - die einzige Hoffnung war PyFFmpeg, aber ich fand, dass es jetzt nicht beibehalten wird). Ich weiß nicht, ob es die richtige Lösung ist, und ich suche nach einem guten.
Ich sah gefunden gstreamer und es ist schön, aber nicht in der Lage meiner Bedürfnisse zu befriedigen - die einzige Art, wie ich dies von der Kommandozeile erreichen gefunden sieht aus wie

gst-launch-0.10 playbin2 uri=file://`pwd`/ex.mp4 audio-sink='identity single-segment=true ! audioconvert ! audio/x-raw-int, endianness=(int)1234, signed=(boolean)true, width=(int)16, depth=(int)16, rate=(int)16000, channels=(int)1 ! wavenc ! filesink location=foo.wav’ 

Aber es ist nicht effizient, weil ich ewig warten müssen, während Video abspielen und gleichzeitig in die WAV-Datei schreiben.

ffmpeg ist viel besser:

avconv -i foo.mp4 -ab 160k -ac 1 -ar 16000 -vn ffaudio.wav 

Aber ich bin nicht in der Lage es von Python zu starten (nicht als Befehlszeilen subprocess). Könnten Sie mir bitte die Vor- und Nachteile aufzeigen, wie Sie ffmpeg von Python als Kommandozeilenprogramm starten? (Ich meine Python multiprocessing Modul oder etwas ähnliches).

Und zweite Frage.

Was ist eine einfache Möglichkeit, lange WAV-Datei in Stücke zu schneiden, so dass ich keine Worte brechen? ich meine Stücke von 10-20 sec Länge mit Anfang und Ende während der Pause in Sätzen/Wörtern?

ich weiß, wie sie auf beliebige Stücke zu brechen:

import wave 


win= wave.open('ffaudio.wav', 'rb') 
wout= wave.open('ffsegment.wav', 'wb') 

t0, t1= 2418, 2421 # cut audio between 2413, 2422 seconds 
s0, s1= int(t0*win.getframerate()), int(t1*win.getframerate()) 
win.readframes(s0) # discard 
frames= win.readframes(s1-s0) 

wout.setparams(win.getparams()) 
wout.writeframes(frames) 

win.close() 
wout.close() 
+0

Sie erwähnen 'ffmpeg', aber Sie verwenden' avconv'. – LordNeckbeard

+0

Siehe http://stackoverflow.com/questions/9477115/who-can-tell-me-the-difference-and-relation-between-ffmpeg-libav-and-avconv. Sie sind verschiedene Projekte und ersetzen einander. 'avconv' wenn Gabel von' ffmpeg', die gemacht wurde, um sich von 'FFmpeg project' zu distanzieren. – xolodec

+0

Wenn Sie ffmeg in ubuntu starten, sehen Sie folgende Meldung: 'Das ffmpeg-Programm wird nur für Skriptkompatibilität bereitgestellt und in einer zukünftigen Version entfernt. Es wurde im Libav-Projekt als veraltet eingestuft, um inkompatible Befehlszeilensyntaxverbesserungen in seiner Ersetzung namens avconv zuzulassen. Bitte verwenden Sie stattdessen avconv.' – xolodec

Antwort

18

Es ist eine sehr einfache Aufgabe mit ffmpeg mit Python subprocess und es gibt einen Grund, warum die Menschen zu dieser Lösung als verweisen gute Lösung.

Dies ist der grundlegende Befehl Audio von einer bestimmten Video-Datei zu extrahieren:

ffmpeg -i test.mp4 -ab 160k -ac 2 -ar 44100 -vn audio.wav

Die Python-Code wird nur diesen Befehl Einwickeln:

import subprocess 

command = "ffmpeg -i C:/test.mp4 -ab 160k -ac 2 -ar 44100 -vn audio.wav" 

subprocess.call(command, shell=True) 

Sie müssen sicherstellen, dass ffmpeg ist eine bekannte Aufgabe, so in Ihrer Variablen Systemumgebung unter Pfad, der Pfad zu ffmpeg.exe sollte aufgelistet werden, oder Sie können einfach den vollständigen Pfad zur exe in Ihrem Python-Code verwenden.

+0

Vielen Dank Mach. Aber ich bin Python nicht neu und weiß, wie man das mit dem Modul 'Subprozess' oder 'Multiprocessing' erreicht. Ich habe nach möglichen Nachteilen dieses Ansatzes gefragt. Außer dem unbekannten Pfad zu 'ffmpeg'/'aconv' in einem System (welches ich leicht selbst finden konnte) kenne ich nichts von ihnen. Also habe ich diese Frage in der Hoffnung gestellt, dass mir jemand andere Nachteile dieses Ansatzes aufzeigen wird. – xolodec

+0

Ehrlich gesagt, wenn Sie versuchen, frei verfügbare Bibliotheken zu verwenden, glaube ich nicht, dass Sie etwas besser und einfacher zu verwenden dann ffmpeg finden. – user1767754

+0

Müssen wir in diesem Code den absoluten Pfad zu "videofile" und "audiofile" angeben, wenn sich unsere '.py'-Datei an einer anderen Stelle befindet? – abhi1610

3

könnte dies besser und einfacher als ffmpeg zu verwenden, ist es Python-Video-Konverter, genannt und verwendet werden kann, um den Ton von Video zu extrahieren, https://github.com/senko/python-video-converter, es in Verbindung mit mpg123 verwendet werden könnte, wie

from converter import Converter 
    import os 
    c = Converter() 
    clip = 'clip.avi' 
    conv = c.convert(clip, 'audio.mp3', {'format':'mp3','audio':{'codec': 'mp3','bitrate':'22050','channels':1}}) 
    for timecode in conv: 
     pass  
    os.system("mpg123 -w audio.wav audio.mp3") 
folgt

das Wandlermodul extrahiert die Audiodaten von dem Video und speichert sie als mP3-Datei, während mpg123 die mP3-Datei in mP4 konvertiert,

eine andere Lösung wie folgt: moviepy Modul in python mit https://github.com/Zulko/moviepy

import moviepy.editor as mp 
    clip = mp.VideoFileClip("video.avi").subclip(0,20) 
    clip.audio.write_audiofile("theaudio.mp3") 

Die Zahlen innerhalb der Subclip-Funktion geben den Beginn und das Ende des Audiosignals in Sekunden an. Sie können dann mpg123 verwenden, um die Audio-in ein anderes Format kann