Аудиофайлы, загруженные с YouTube-DL, повреждены

#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 и вырезать его.