#python-3.x #pydub
#python-3.x #pydub
Вопрос:
Я пытался найти положение пробелов звуковой тишины в аудио видео, но я не могу пройти мимо простого импорта аудиофайла с помощью pydub в python 3
Я уже пытался изменить каталог, который pydub проверяет на наличие ffmpeg, на один в проекте, и файл находится в каталоге, из которого я запускаю скрипт, но, похоже, он по-прежнему возвращает ту же ошибку.
from moviepy import editor
from pydub import silence, AudioSegment
from pathlib import Path
import os
AudioSegment.converter = r"C:\Users\ratee\PycharmProjects\untitled\ffmpeg\bin\ffmpeg.exe"
vid = editor.VideoFileClip("video.mp4")
print(AudioSegment.ffmpeg)
my_file = Path("audio.mp3")
if not my_file.is_file():
vid.audio.write_audiofile("audio.mp3")
audio = AudioSegment.from_mp3("audio.mp3")
print(audio)
Я ожидаю, что он сохранит аудиосегмент mp3 в переменной audi
, но он возвращает:
Traceback (most recent call last):
File "C:Program FilesJetBrainsPyCharm Community Edition 2019.1.1helperspydevpydevd.py", line 1741, in <module>
main()
File "C:Program FilesJetBrainsPyCharm Community Edition 2019.1.1helperspydevpydevd.py", line 1735, in main
globals = debugger.run(setup['file'], None, None, is_module)
File "C:Program FilesJetBrainsPyCharm Community Edition 2019.1.1helperspydevpydevd.py", line 1135, in run
pydev_imports.execfile(file, globals, locals) # execute the script
File "C:Program FilesJetBrainsPyCharm Community Edition 2019.1.1helperspydev_pydev_imps_pydev_execfile.py", line 18, in execfile
exec(compile(contents "n", file, 'exec'), glob, loc)
File "C:/Users/ratee/PycharmProjects/untitled/fuc.py", line 12, in <module>
song = AudioSegment.from_mp3("audio.mp3")
File "C:UsersrateePycharmProjectsuntitledvenvlibsite-packagespydubaudio_segment.py", line 716, in from_mp3
return cls.from_file(file, 'mp3', parameters=parameters)
File "C:UsersrateePycharmProjectsuntitledvenvlibsite-packagespydubaudio_segment.py", line 665, in from_file
info = mediainfo_json(orig_file)
File "C:UsersrateePycharmProjectsuntitledvenvlibsite-packagespydubutils.py", line 263, in mediainfo_json
res = Popen(command, stdin=stdin_parameter, stdout=PIPE, stderr=PIPE)
File "C:UsersrateeAppDataLocalProgramsPythonPython37libsubprocess.py", line 756, in __init__
restore_signals, start_new_session)
File "C:UsersrateeAppDataLocalProgramsPythonPython37libsubprocess.py", line 1155, in _execute_child
startupinfo)
File "C:Program FilesJetBrainsPyCharm Community Edition 2019.1.1helperspydev_pydev_bundlepydev_monkey.py", line 452, in new_CreateProcess
return getattr(_subprocess, original_name)(app_name, patch_arg_str_win(cmd_line), *args)
FileNotFoundError: [WinError 2] The system cannot find the file specified
print(AudioSegment.ffmpeg)
возвращает, как и ожидалось
C:UsersrateePycharmProjectsuntitledffmpegbinffmpeg.exe
print(my_file) returns
возвращает, как и ожидалось
audio.mp3
и код перестает выполняться в тот момент, когда я пытаюсь импортировать аудио
audio = AudioSegment.from_mp3(«audio.mp3»)
Комментарии:
1. выполнили ли вы
print(AudioSegment.ffmpeg)
проверкуprint(my_file)
и, и если да, соответствуют ли они тому, что вы ожидаете?2. Также, пожалуйста, опубликуйте, какие
print(os.getcwd() "\ffmpeg\bin\ffmpeg.exe")
результаты. Соответствует ли он тому, что вы ожидаете.3. Скрипт выдает:
NameError: name 'vid' is not defined
. Idf помещает случайный файл mp3 с именемaudio,mp3
I могу воспроизвести ошибку, которую я опубликую в качестве ответа, но, очевидно, это не ответ. Этим мы можем проверить, что пошло не так.4. Я добавил необходимые изменения :))
Ответ №1:
Первая часть ответа пытается воспроизвести ошибку OPs для сравнения. После этого находим решение с помощью обновления 1 и, наконец, обновления 2. Имена папок x, y используются для сокращения длины пути.
Его воспроизведение выдало мне следующие ошибки:
Ошибка первая:
c:xlibsite-packagespydubutils.py:165: RuntimeWarning: Couldn't find ffmpeg or avconv - defaulting to ffmpeg, but may not work
warn("Couldn't find ffmpeg or avconv - defaulting to ffmpeg, but may not work", RuntimeWarning)
c:xlibsite-packagespydubutils.py:193: RuntimeWarning: Couldn't find ffprobe or avprobe - defaulting to ffprobe, but may not work
warn("Couldn't find ffprobe or avprobe - defaulting to ffprobe, but may not work", RuntimeWarning)
Ошибка вторая:
Traceback (most recent call last):
File "C:ylol.py", line 16, in <module>
audi = AudioSegment.from_mp3("audio.mp3")
File "c:xlibsite-packagespydubaudio_segment.py", line 716, in from_mp3
return cls.from_file(file, 'mp3', parameters=parameters)
File "c:xlibsite-packagespydubaudio_segment.py", line 665, in from_file
info = mediainfo_json(orig_file)
File "c:xlibsite-packagespydubutils.py", line 263, in mediainfo_json
res = Popen(command, stdin=stdin_parameter, stdout=PIPE, stderr=PIPE)
File "c:xlibsubprocess.py", line 676, in __init__
restore_signals, start_new_session)
File "c:xlibsubprocess.py", line 957, in _execute_child
startupinfo)
FileNotFoundError: [WinError 2] The system cannot find the file specified
Следующий код предназначен для проверки того, могут ли быть найдены ffmpeg и ffprobe:
AudioSegment.ffmpeg = os.getcwd() "\ffmpeg\bin\ffmpeg.exe"
print (AudioSegment.ffmpeg)
1) C:yffmpegbinffmpeg.exe
И:
my_file = Path("audio.mp3")
print (my_file)
выдает:
2) audio.mp3
Предлагаемое решение:
Включите следующую конкретную кодовую строку, чтобы указать, где находится ffmpeg:
pydub.AudioSegment.converter = r"C:\path\to\ffmpeg.exe"
где pathto — это фактический путь
И все должно быть в порядке.
Обновление 1:
Возникшая ошибка связана с использованием имени файла в «my_file», а не «filepath», как того требует AudioSegment.from_mp3(my_file)
. Предоставляя путь к файлу, это устраняет возникшую проблему [WinError2].
При запуске приведенного ниже скрипта AttributeError: 'WindowsPath' object has no attribute 'read'
возникает ошибка. Ошибка связана pathlib
и должна была быть исправлена в версии pydub 0.22, как описано здесь, на github. Я поднял этот вопрос на Github.
Возникшая file.read()
проблема связана с версией python (2.7 против 3.5), поскольку ее больше нет во встроенной библиотеке. Поэтому .read()
возникает AttributeError: 'WindowsPath' object has no attribute 'read'
ошибка.
from pydub import silence, AudioSegment
from pathlib import Path
import os, sys
print (sys.version)
#AudioSegment.ffmpeg = os.getcwd() "\ffmpeg\bin\ffmpeg.exe"
AudioSegment.converter = r"C:\x\build\win\64\ffmpeg.exe"
AudioSegment.ffprobe = r"C:\x\build\win\64\ffprobe.exe"
#print (AudioSegment.converter)
#print (AudioSegment.ffprobe)
my_file = Path("C:\y\audio.mp3")
print ('ID1 : %s' % my_file)
audio = AudioSegment.from_mp3(my_file) # solves ***[WinError2]*** issue.
Обновление 2:
Поскольку обновление 1 решает проблему с версией платформы, обновление 2 решает проблему с ошибкой один и два одновременно, если решение 1 в обновлении 1 еще не решает ее.
Включите в свой скрипт непосредственно после инструкций import следующие строки:
mypaths = os.getenv('PATH').split(';') # replace 'PATH' by 'your search path' if needed.
for i in mypaths:
if i.find('python'):
print(i)
Распечатка показывает, указали ли вы местоположение файлов FFmpeg или нет. Если нет, вам нужно перезагрузить Windows из-за того, что пути среды Windows не обновляются, пока вы находитесь в среде / редакторе python.
В моем случае после перезагрузки c:yFFmpeg
появился раздел «ПУТЬ», и все предупреждения об ошибках один и два исчезли.
Комментарии:
1. Спасибо за разъяснение для всех. Я попробовал предложенное вами решение, но, боюсь, оно не сработало
Ответ №2:
Я столкнулся с той же проблемой.
pydub.AudioSegment.converter = os.getcwd() "\ffmpeg.exe"
pydub.AudioSegment.ffprobe = os.getcwd() "\ffprobe.exe"
sound = pydub.AudioSegment.from_mp3(os.getcwd() "\sample.mp3")
И все в порядке
Ответ №3:
Я столкнулся с той же проблемой, но, по-видимому, даже после добавления ffmpeg
пути он по-прежнему выдает ту же ошибку. Я попробовал это Linux
без дополнительных команд, вроде AudioSegment.converter = 'pathtoffmpeg'
все работает нормально, проблема в Windows IDE (pycharm, spyder и т. Д.). Попробуйте запустить скрипт непосредственно из вашего приглашения (anaconda, cmd и т. Д.) В Windows. Он должен работать.