web-dev-qa-db-fra.com

Extrait python wav du fichier vidéo

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()
16
xolodec

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.

23
user1767754

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

4
programmer44

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)
0
Nick Korolkov