Как вернуть обработанный ffmepg выходной файл и передать его другой функции? используя питон - PullRequest
0 голосов
/ 05 сентября 2018

Я хочу преобразовать видео в аудио, используя ffmpeg, и я также хочу вернуть этот аудиофайл и передать его другой функции, которая генерирует текст из этого аудио. Но когда я передаю 'audio' функции, ошибка показывает, что файл не найден ..

def extract_audio(f):
print("processing", f)
inFile = f
outFile = f[:-3] + "wav"
cmd = "ffmpeg -i {} -vn  -ac 2 -ar 44100 -ab 320k -f wav {}".format(inFile, outFile)
os.popen(cmd)
print(outFile)
print("Audio is ready to use..")
return outFile

def audio_to_text(audio):
r = sr.Recognizer()
r.energy_threshold = 4000
with sr.WavFile(open(audio)) as source:  # use "test.wav" as the audio source
    audio_source = r.record(source)  # extract audio data from the file
    text = r.recognize_google(audio_source)
try:
    print(text)  # recognize speech using Google Speech Recognition
except LookupError:  # speech is unintelligible
    print("Could not understand audio")

root = tk.Tk()
root.withdraw()
file_path = filedialog.askopenfilename()
filename = os.path.basename(file_path)
audio = extract_audio(filename)
audio_to_text(audio)

Ответы [ 2 ]

0 голосов
/ 05 сентября 2018

Одной из проблем является то, что os.popen() возвращает дескриптор на выходе процесса и возвращает его вызывающей стороне, оставляя программу работающей в фоновом режиме.

Итак, когда вы вызываете вашу постобработку аудио, ffmpeg еще не закончил запуск / может даже не начал создавать аудио файл (состояние гонки между вашим процессом и подпроцессом ffmpeg)

Вы должны ждать , чтобы команда завершилась. Я бы использовал subprocess.check_call для этого и список аргументов вместо того, чтобы составлять команду как строку (которая должна быть разбита, возможно, с ошибками в кавычках / пробелах):

cmd = ["ffmpeg","-i",inFile,"-vn","-ac","2","-ar","44100","-ab","320k","-f","wav",outFile]
subprocess.check_call(cmd)

когда возвращается check_call (без исключения), это означает, что ffmpeg завершил создание выходного файла. Вы можете смело пытаться открыть его для чтения прямо сейчас.

0 голосов
/ 05 сентября 2018

Файл существует? Я бы предложил вместо этого использовать exit_state = os.system(cmd) и убедиться, что exit_state равен нулю, прежде чем возвращать outFile. При этом вы убедитесь, что команда ffmpeg успешно завершена.

...