#python #python-3.x #ffmpeg #youtube-dl
#python #python-3.x #ffmpeg #youtube-dl
Вопрос:
Я написал небольшой фрагмент кода, который загружает аудио и видео с YouTube с помощью YouTube-DL
. Вот мой код:
from __future__ import unicode_literals
import youtube_dl
link = input("Enter the video link:")
while True:
choice = input("Enter a for audio file, v for video file:")
if choice == "a" or choice == "v":
break
ydl_opts = {}
if choice == "a":
ydl_opts = {
'format': 'bestaudio/best',
'postprocessors': [{
'key': 'FFmpegExtractAudio',
'preferredcodec': 'mp3',
'preferredquality': '192',
}],
}
else:
ydl_opts = {'format':137}
with youtube_dl.YoutubeDL(ydl_opts) as ydl:
info_dict = ydl.extract_info(link, download=False)
video_title = info_dict.get('title', None)
if choice == "a":
path = f'D:\DwnldsYT\{video_title}.mp3'
if choice == "v":
path = f'D:\DwnldsYT\{video_title}.mp4'
ydl_opts.update({'outtmpl':path})
with youtube_dl.YoutubeDL(ydl_opts) as ydl:
ydl.download([link])
Это работает нормально. Я могу воспроизводить загруженный звук. Но когда я пытаюсь прочитать тот же аудиофайл, он показывает мне ошибку.
Код:
from pydub import AudioSegment
song = AudioSegment.from_mp3("D:\DwnldsYT\Cartoon - On amp; On (feat. Daniel Levi) [NCS Release].mp3")
Вывод:
Error while decoding stream #0:0: Invalid data found when processing input
[mp3float @ 000001f2425c2500] Header missing
Error while decoding stream #0:0: Invalid data found when processing input
[mp3float @ 000001f2425c2500] Header missing
Error while decoding stream #0:0: Invalid data found when processing input
[mp3float @ 000001f2425c2500] Header missing
Error while decoding stream #0:0: Invalid data found when processing input
[mp3float @ 000001f2425c2500] Header missing
Error while decoding stream #0:0: Invalid data found when processing input
[mp3float @ 000001f2425c2500] Header missing
Error while decoding stream #0:0: Invalid data found when processing input
[mp3float @ 000001f2425c2500] Header missing
Error while decoding stream #0:0: Invalid data found when processing input
[mp3float @ 000001f2425c2500] Header missing
Error while decoding stream #0:0: Invalid data found when processing input
[mp3float @ 000001f2425c2500] Header missing
Error while decoding stream #0:0: Invalid data found when processing input
[mp3float @ 000001f2425c2500] Header missing
Error while decoding stream #0:0: Invalid data found when processing input
[mp3float @ 000001f2425c2500] Header missing
Error while decoding stream #0:0: Invalid data found when processing input
[mp3float @ 000001f2425c2500] Header missing
Error while decoding stream #0:0: Invalid data found when processing input
[mp3float @ 000001f2425c2500] Header missing
Error while decoding stream #0:0: Invalid data found when processing input
[mp3float @ 000001f2425c2500] Header missing
Error while decoding stream #0:0: Invalid data found when processing input
[mp3float @ 000001f2425c2500] Header missing
Error while decoding stream #0:0: Invalid data found when processing input
[mp3float @ 000001f2425c2500] Header missing
Error while decoding stream #0:0: Invalid data found when processing input
[mp3float @ 000001f2425c2500] Header missing
Error while decoding stream #0:0: Invalid data found when processing input
[mp3float @ 000001f2425c2500] Header missing
Error while decoding stream #0:0: Invalid data found when processing input
[mp3float @ 000001f2425c2500] Header missing
Error while decoding stream #0:0: Invalid data found when processing input
[mp3float @ 000001f2425c2500] Header missing
Error while decoding stream #0:0: Invalid data found when processing input
[mp3float @ 000001f2425c2500] Header missing
Error while decoding stream #0:0: Invalid data found when processing input
[mp3float @ 000001f2425c2500] Header missing
Error while decoding stream #0:0: Invalid data found when processing input
[mp3float @ 000001f2425c2500] Header missing
Error while decoding stream #0:0: Invalid data found when processing input
[mp3float @ 000001f2425c2500] Header missing
Error while decoding stream #0:0: Invalid data found when processing input
[mp3float @ 000001f2425c2500] Header missing
Error while decoding stream #0:0: Invalid data found when processing input
[mp3float @ 000001f2425c2500] Header missing
Error while decoding stream #0:0: Invalid data found when processing input
[mp3float @ 000001f2425c2500] Header missing
Error while decoding stream #0:0: Invalid data found when processing input
[mp3float @ 000001f2425c2500] Header missing
Error while decoding stream #0:0: Invalid data found when processing input
[mp3float @ 000001f2425c2500] Header missing
Error while decoding stream #0:0: Invalid data found when processing input
[mp3float @ 000001f2425c2500] Header missing
Error while decoding stream #0:0: Invalid data found when processing input
[mp3float @ 000001f2425c2500] Header missing
Error while decoding stream #0:0: Invalid data found when processing input
[mp3float @ 000001f2425c2500] Header missing
Error while decoding stream #0:0: Invalid data found when processing input
[mp3float @ 000001f2425c2500] Header missing
Error while decoding stream #0:0: Invalid data found when processing input
[mp3float @ 000001f2425c2500] Header missing
Error while decoding stream #0:0: Invalid data found when processing input
[mp3float @ 000001f2425c2500] Header missing
Error while decoding stream #0:0: Invalid data found when processing input
[mp3float @ 000001f2425c2500] Header missing
Error while decoding stream #0:0: Invalid data found when processing input
[mp3float @ 000001f2425c2500] Header missing
Error while decoding stream #0:0: Invalid data found when processing input
[mp3float @ 000001f2425c2500] Header missing
Error while decoding stream #0:0: Invalid data found when processing input
[mp3float @ 000001f2425c2500] Header missing
Error while decoding stream #0:0: Invalid data found when processing input
[mp3float @ 000001f2425c2500] Header missing
Error while decoding stream #0:0: Invalid data found when processing input
[mp3float @ 000001f2425c2500] Header missing
Error while decoding stream #0:0: Invalid data found when processing input
[mp3float @ 000001f2425c2500] Header missing
Error while decoding stream #0:0: Invalid data found when processing input
[mp3float @ 000001f2425c2500] Header missing
Error while decoding stream #0:0: Invalid data found when processing input
[mp3float @ 000001f2425c2500] Header missing
Error while decoding stream #0:0: Invalid data found when processing input
[mp3float @ 000001f2425c2500] Header missing
Error while decoding stream #0:0: Invalid data found when processing input
[mp3float @ 000001f2425c2500] Header missing
Error while decoding stream #0:0: Invalid data found when processing input
[mp3float @ 000001f2425c2500] Header missing
Error while decoding stream #0:0: Invalid data found when processing input
[mp3float @ 000001f2425c2500] Header missing
Error while decoding stream #0:0: Invalid data found when processing input
[mp3float @ 000001f2425c2500] Header missing
Error while decoding stream #0:0: Invalid data found when processing input
[mp3float @ 000001f2425c2500] Header missing
Error while decoding stream #0:0: Invalid data found when processing input
[mp3float @ 000001f2425c2500] Header missing
Error while decoding stream #0:0: Invalid data found when processing input
[mp3float @ 000001f2425c2500] Header missing
Error while decoding stream #0:0: Invalid data found when processing input
[mp3float @ 000001f2425c2500] Header missing
Error while decoding stream #0:0: Invalid data found when processing input
[mp3float @ 000001f2425c2500] Header missing
Error while decoding stream #0:0: Invalid data found when processing input
[mp3float @ 000001f2425c2500] Header missing
Error while decoding stream #0:0: Invalid data found when processing input
[mp3float @ 000001f2425c2500] Header missing
Error while decoding stream #0:0: Invalid data found when processing input
[mp3float @ 000001f2425c2500] Header missing
Error while decoding stream #0:0: Invalid data found when processing input
[mp3float @ 000001f2425c2500] Header missing
Error while decoding stream #0:0: Invalid data found when processing input
[mp3float @ 000001f2425c2500] Header missing
Error while decoding stream #0:0: Invalid data found when processing input
[mp3float @ 000001f2425c2500] Header missing
Error while decoding stream #0:0: Invalid data found when processing input
[mp3float @ 000001f2425c2500] Header missing
Error while decoding stream #0:0: Invalid data found when processing input
[mp3float @ 000001f2425c2500] Header missing
Error while decoding stream #0:0: Invalid data found when processing input
[mp3float @ 000001f2425c2500] Header missing
Error while decoding stream #0:0: Invalid data found when processing input
[mp3float @ 000001f2425c2500] Header missing
Error while decoding stream #0:0: Invalid data found when processing input
[mp3float @ 000001f2425c2500] Header missing
Error while decoding stream #0:0: Invalid data found when processing input
[mp3float @ 000001f2425c2500] Header missing
Error while decoding stream #0:0: Invalid data found when processing input
[mp3float @ 000001f2425c2500] Header missing
Error while decoding stream #0:0: Invalid data found when processing input
[mp3float @ 000001f2425c2500] Header missing
Error while decoding stream #0:0: Invalid data found when processing input
[mp3float @ 000001f2425c2500] Header missing
Error while decoding stream #0:0: Invalid data found when processing input
[mp3float @ 000001f2425c2500] Header missing
Error while decoding stream #0:0: Invalid data found when processing input
[abuffer @ 000001f242280300] Value inf for parameter 'time_base' out of range [0 - 2.14748e 09]
Last message repeated 3 times
[abuffer @ 000001f242280300] Error setting option time_base to value 1/0.
[graph_0_in_0_0 @ 000001f242280e80] Error applying options to the filter.
Error reinitializing filters!
Error while filtering: Result too large
Finishing stream 0:0 without any data written to it.
[abuffer @ 000001f242280300] Value inf for parameter 'time_base' out of range [0 - 2.14748e 09]
Last message repeated 3 times
[abuffer @ 000001f242280300] Error setting option time_base to value 1/0.
[graph_0_in_0_0 @ 000001f242280e80] Error applying options to the filter.
Error configuring filter graph
Conversion failed!
Это потому, что загруженный звук поврежден? И как решить эту проблему? Любая помощь будет оценена. Спасибо!
Комментарии:
1. Может ли быть так, что, хотя файл имеет
.mp3
расширение, он может быть закодирован как.aac
формат (кодек AAC)? Который является форматом по умолчанию для.mp4
видеокодека и AVC.2. Попробуйте сделать
ffmpeg -i filename.mp3
и посмотрите, для MP3 он должен выводить что-то вродеStream #0:0: Audio: mp3, 44100 Hz, stereo, fltp, 320 kb/s
.3. Попробуйте просто сделать
AudioSegment.from_file(path)
вместоAudioSegment.from_mp3(path)
.4. Да …
AudioSegment.from_file(path)
работает. Но затем, если я загружаю загруженный аудиофайл на веб-сайт, веб-сайт не может обработать аудиофайл должным образом.5. Например, это веб-сайт, на который я хотел загрузить свой аудиофайл — audioalter.com/8d-audio Если я загружаю свой аудиофайл на этот сайт, он не преобразует его в 8d.
Ответ №1:
Вероятно, ваш аудиофайл закодирован не как MP3. Вероятно, это AAC (обычно имеющий расширение файла .aac
), который является форматом по умолчанию для .mp4
видеокодека и AVC и youtube.
Вместо AudioSegment.from_mp3(path)
того, чтобы пытаться это сделать AudioSegment.from_file(path)
, он сам обнаружит формат или AudioSegment.from_file(path, format = 'aac')
заставит его декодировать AAC.
Также вы можете определить формат с помощью FFMpeg, запустив ffmpeg -i filename.mp3
, для MP3 он должен выводить что-то вроде Stream #0:0: Audio: mp3, 44100 Hz, stereo, fltp, 320 kb/s
, а для других форматов он будет mp3
нестроковым.
Вероятно youtube-dl
, в библиотеке есть несколько вариантов, чтобы всегда принудительно перекодировать в MP3, если вам действительно нужен только MP3, хотя имейте в виду, что вы потеряете некоторое качество при повторном преобразовании. Прямо сейчас ваши параметры содержат preferred
word для MP3, это означает, что он предпочитает загрузку MP3, но не использует этот формат вывода.
Если для вас не имеет значения, является ли это MP3 или AAC, тогда придерживайтесь оригинального формата YouTube, тогда вы сохраните наилучшее качество, вы также можете переименовывать файлы с .aac
расширением для наглядности.
Если вы хотите, чтобы загруженные с Youtube файлы были обработаны позже, например, сайтом 8D Audio, то, чтобы не потерять качество при обработке, вам нужно преобразовать ваш файл в какой-нибудь формат без потерь, например WAV. Вы можете сделать это с помощью инструмента FFMpeg, например ffmpeg -i filename.aac filename.wav
.
Кроме того, на сайте 8D Audio 20MB
установлен размер файла, поэтому вам может потребоваться разделить ваш WAV-файл. Для того, чтобы разделить на части по 30 секунд каждая, вам нужно запустить ffmpeg -i filename.wav -f segment -segment_time 30 -c copy "filenamed.wav"
, а затем загрузить и обработать каждую часть. Впоследствии вы можете объединить обработанные WAV-файлы, используя sox as sox sound0*.wav soundall.wav
. И конвертируйте в некоторый сжатый, но без потерь формат, такой как FLAC as ffmpeg -i soundall.wav soundall.flac
.
Все команды преобразования / разделения / слияния могут быть легко автоматизированы с помощью стандартного подпроцесса модуля Python. Например, для запуска любой команды, подобной ffmpeg -i sound.mp3 sound.wav
той, которую вам нужно выполнить в Python, достаточно одной строки subprocess.run(['ffmpeg', '-i', 'sound.mp3', 'sound.wav'], check = True)
.
Все профессионалы редактируют и хранят аудиофайлы в каком-либо формате без потерь, таком как WAV или FLAC, чтобы не терять качество на каждом этапе обработки, поэтому это хорошая практика, особенно если вы хотите обработать файл 8D -определенно, повторное преобразование MP3 несколько раз будет плохой идеей.
Если эта библиотека выполняет математически корректное преобразование 8D, то мой следующий код выполнит правильное преобразование WAV, это всего лишь минимальный рабочий подкод этой библиотеки только для WAV.
# Needs: python -m pip install pydub numpy
def ConvertTo8D(input_file_name, output_file_name, *, period = 200):
import numpy as np
from pydub import AudioSegment
if period < 0:
period = -period
elif period == 0:
period = 200
audio = AudioSegment.from_file(input_file_name)
audio = audio AudioSegment.silent(duration = 150)
eightD = AudioSegment.empty()
pan = 0.9 * np.sin(np.linspace(0, 2. * np.pi, period))
for i, chunk in enumerate(audio[::100]):
if len(chunk) < 100:
continue
newChunk = chunk.pan(pan[i % period])
eightD = eightD newChunk
eightD.export(output_file_name, format = output_file_name[output_file_name.rfind('.') 1:])
# Test Usage
ConvertTo8D('sound.wav', 'sound-8D.wav')
Комментарии:
1. Спасибо! Небольшой запрос. Должен ли я изменить
preferred
wav
, чтобыyoutube-dl
загружать аудио в видеwav
файла?2. Но размер файла слишком велик, когда я загружаю аудио как
wav
. Размер файла аудио youtu.be/Hn4sfC2PbhI это почти 40 мб.3. @Sushil
preferred
этой библиотекой, вероятно, означает следующее поведение — он запрашивает Youtube для всех доступных форматов видео / аудиопотоков, затем, если он находитpreferred
формат аудио среди исходных форматов потока, он загружает этот предпочтительный формат, в противном случае он загружает какой-то наиболее близкий к предпочтительному формату. Следовательно, это не означает, что загруженный формат будет точно таким, как указано в preferred . Он просто пытается найти ближайший загружаемый формат, но без повторного преобразования.4. Хорошо … Но какой размер файла?
5. @Sushil Вы говорите, что WAV слишком большой. Это не большая проблема, потому что я изменил свой ответ, чтобы включить команды разрезания на 30-секундные или более части, используйте эту команду. Если вы хотите обработку в формате 8D, вам определенно следует загрузить оригинальный WAV и вырезать его.