En relation:
Comment extraire l'audio d'un fichier vidéo en utilisant python?
Extraire l'audio de la vidéo au format wav
Comment extraire l'audio d'une vidéo?
Ma question est la suivante: comment extraire une piste audio wav d’un fichier vidéo, par exemple video.avi
? J'ai lu de nombreux articles et partout où les gens suggèrent d'utiliser (à partir de Python) ffmpeg
en tant que sous-processus (car il n'y a pas de liaisons python fiables à ffmpeg - le seul espoir était PyFFmpeg
mais je l'ai trouvé non maintenu maintenant). Je ne sais pas si c'est la bonne solution et je cherche une bonne.
J’ai jeté un œil à gstreamer et j’ai trouvé le système agréable, mais incapable de satisfaire mes besoins.
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’
Mais ce n’est pas efficace car je dois attendre très longtemps pour lire une vidéo et écrire simultanément dans un fichier wav.
ffmpeg
est bien meilleur:
avconv -i foo.mp4 -ab 160k -ac 1 -ar 16000 -vn ffaudio.wav
Mais je ne peux pas le lancer à partir de python (pas en tant que sous-processus de ligne de commande). Pourriez-vous me signaler les avantages et les inconvénients du lancement de ffmpeg à partir de python en tant qu'utilitaire de ligne de commande? (Je veux dire en utilisant python multiprocessing
module ou quelque chose de similaire).
Et deuxième question.
Quel est le moyen simple de couper un long fichier wav en plusieurs parties afin que je ne casse aucun mot? Je veux dire des morceaux de 10-20 secondes avec début et fin pendant la pause dans les phrases/mots?
je sais comment les casser sur des morceaux arbitraires:
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()
C'est une tâche très facile d'utiliser le sous-processus ffmpeg with python et il y a une raison pour laquelle les gens considèrent cette solution comme une bonne solution.
C'est la commande de base pour extraire l'audio d'une vidéo donnée. Fichier:
ffmpeg -i test.mp4 -ab 160k -ac 2 -ar 44100 -vn audio.wav
Le code Python encapsule simplement cette commande:
import subprocess
command = "ffmpeg -i C:/test.mp4 -ab 160k -ac 2 -ar 44100 -vn audio.wav"
subprocess.call(command, Shell=True)
Vous devez vous assurer que ffmpeg est une tâche connue. Ainsi, dans les variables d'environnement de votre système, sous chemin, le chemin d'accès à ffmpeg.exe devrait être répertorié, ou vous pouvez simplement utiliser le chemin d'accès complet à l'exe dans votre code python.
Les clips audio peuvent être créés à partir d'un fichier audio ou de la bande son d'un fichier vidéo
from moviepy.editor import *
audioclip = AudioFileClip("some_audiofile.mp3")
audioclip = AudioFileClip("some_video.avi")
https://zulko.github.io/moviepy/getting_started/audioclips.html
cela pourrait être meilleur et plus facile à utiliser que ffmpeg, il s'appelle python-video converter et peut être utilisé pour extraire l'audio de vidéo, https://github.com/senko/python-video-converter , it pourrait être utilisé avec mpg123, comme suit
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")
le module de conversion extrait l'audio de la vidéo et l'enregistre sous un fichier mp3, tandis que mpg123 convertit le fichier mp3 en mp4,
une solution différente est la suivante: using le module moviepy en python https://github.com/Zulko/moviepy
import moviepy.editor as mp
clip = mp.VideoFileClip("video.avi").subclip(0,20)
clip.audio.write_audiofile("theaudio.mp3")
les nombres dans la fonction sous-clip spécifient le début et la fin de l'audio, en secondes. vous pouvez ensuite utiliser mpg123 pour changer l'audio en un autre format
ou par exemple extrait mp3 de
import os
VIDEOS_PATH = '/Users/****/videos'
VIDEOS_EXTENSION = '.webm' # for example
AUDIO_EXT = 'wav'
EXTRACT_VIDEO_COMMAND = ('ffmpeg -i "{from_video_path}" '
'-f {audio_ext} -ab 192000 '
'-vn "{to_audio_path}"')
os.chdir(VIDEOS_PATH)
files = os.listdir(VIDEOS_PATH)
for f in files:
if not f.endswith(VIDEOS_EXTENSION):
continue
audio_file_name = '{}.{}'.format(f, AUDIO_EXT)
command = EXTRACT_VIDEO_COMMAND.format(
from_video_path=f, audio_ext=AUDIO_EXT, to_audio_path=audio_file_name,
)
os.system(command)