2014-11-04 81 views
12

Correlati:Python estratto wav da file video

How to extract audio from a video file using python?

Extract audio from video as wav

How to rip the audio from a video?

mia domanda è come ho potuto estrarre traccia audio WAV da file video, dire video.avi? Ho letto molti articoli e dappertutto le persone suggeriscono di usare (da Python) ffmpeg come sottoprocesso (perché non ci sono collegamenti Python affidabili per ffmpeg - l'unica speranza era PyFFmpeg ma ho trovato che non è ancora intesa). Non so se sia la soluzione giusta e sto cercando uno buono.
ho cercato di gstreamer e hanno trovato bello, ma in grado di soddisfare i miei bisogni - l'unico modo che ho trovato per raggiungere questo obiettivo da riga di comando si presenta come

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’ 

Ma non è efficiente perché ho bisogno di aspettare dei secoli, mentre riprodurre video e contemporaneamente scrivere in un file wav.

ffmpeg è molto meglio:

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

Ma io sono in grado di lanciarlo in pitone (non come una linea sottoprocesso di comando). Potresti per favore indicarmi i pro e i contro del lancio di ffmpeg da python come utility da riga di comando? (Voglio dire usando il modulo python multiprocessing o qualcosa di simile).

E seconda domanda.

Qual è il modo semplice per tagliare i file wav lunghi in modo che non si rompa alcuna parola? Voglio dire pezzi di 10-20 secondi di lunghezza con inizio e fine durante la pausa in frasi/parole?

so come rompere loro su pezzi arbitrarie:

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

Hai detto 'ffmpeg', ma stai usando' avconv'. – LordNeckbeard

+0

Vedere http://stackoverflow.com/questions/9477115/who-can-tell-me-the-difference-and-relation-between-ffmpeg-libav-and-avconv. Sono progetti diversi e sostituzioni l'una con l'altra. 'avconv' se fork di' ffmpeg' che è stato fatto per allontanarsi dal 'progetto FFmpeg'. – xolodec

+0

Se lanciate ffmeg in ubuntu vedrete un messaggio come questo: 'Il programma ffmpeg è fornito solo per la compatibilità degli script e verrà rimosso in una versione futura. È stato deprecato nel progetto Libav per consentire miglioramenti della sintassi della riga di comando incompatibili nella sua sostituzione chiamata avconv. Per favore usa avconv invece. – xolodec

risposta

18

Si tratta di un compito molto facile usando ffmpeg con pitone sottoprocesso e c'è un motivo per cui le persone siano rivolte a questa soluzione come un buona soluzione.

Questo è il comando di base estrarre l'audio da un dato file video:

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

Il codice Python è solo avvolgendo questo comando:

import subprocess 

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

subprocess.call(command, shell=True) 

bisogna fare in modo che ffmpeg è un compito conosciuto, così nelle variabili di ambiente di sistema, nel percorso, il percorso dovrebbe ffmpeg.exe essere elencati, oppure puoi semplicemente utilizzare il percorso completo per l'exe nel tuo codice Python.

+0

Grazie mille mach. Ma non sono nuovo a Python e so come farlo con il modulo 'subprocess' o' multiprocessing'. Stavo chiedendo dei possibili svantaggi di questo approccio. Tranne il percorso sconosciuto a 'ffmpeg' /' aconv' in un sistema (che potrei facilmente trovare da solo) non ne so nulla. Così ho fatto questa domanda nella speranza che qualcuno mi indichi altri svantaggi di questo approccio. – xolodec

+0

Onestamente, se stai cercando di usare librerie libere disponibili, non penso che troverai qualcosa di meglio e più facile da usare allora ffmpeg. – user1767754

+0

Dobbiamo specificare il percorso assoluto verso 'videofile' e' audiofile' in questo codice, se il nostro file '.py' si trova in un posto diverso? – abhi1610

3

questo potrebbe essere migliore e più facile da usare rispetto ffmpeg, si chiama convertitore python-video, e può essere utilizzato per estrarre l'audio dal video, https://github.com/senko/python-video-converter, potrebbe essere utilizzato in combinazione con mpg123, come segue

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") 

il modulo convertitore estrae l'audio dal video e la salva come file MP3, mentre mpg123 converte il file mp3 a mp4,

una soluzione diversa è la seguente: utilizzando il modulo in Python moviepy https://github.com/Zulko/moviepy

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

i numeri all'interno della funzione sottoclip specificano inizio e fine dell'audio, in secondi. è quindi possibile utilizzare mpg123 per cambiare l'audio a qualsiasi altro formato