Как экспортировать фрагменты волны в те же биты на выборку, что и исходный файл

#python #ffmpeg #wave #pydub

#python #ffmpeg #волна #pydub

Вопрос:

Я просматриваю большой файл wave с помощью словаря новых имен файлов, длин и версий. Цикл экспортирует отдельные фрагменты в виде файлов:

 mix.export(key, format='wav')
  

Однако он преобразует исходный 24-разрядный файл в 32-разрядные фрагменты. Я обошел pro tools, чтобы вернуть файлы обратно в 24, поскольку я не могу определить ни настройки ffmpeg, ни передачу фрагмента в подпроцесс.

Я попробовал несколько вариантов этой темы:

 mix.export(key, format='wav', codec='pcm_s24le')
  

А также этот:

 mix.export(k, format='wav', parameters=['ffmpeg', '-i', '-acodec', 'pcm_s24le', '-ar', '48000'])
  

Кажется, я не могу заставить отдельные фрагменты работать в следующем вызове подпроцесса. key это имя файла из пары ключ-значение. Это хорошо работает при 32-разрядном экспорте, но не уверен, как заставить его работать, когда требуется вызвать временный файл фрагмента, такой /var/folders/vc/q7jggn7900l099w45463lgx40000gn/T/tmpw_6mxyg8 как.

 subprocess.call(['ffmpeg', '-i', key, 
                 '-acodec', 'pcm_s24le', '-ar', '48000', 'output.wav'])
  

Надеемся на фрагменты точно такого же формата, что и исходный ввод:

 mix_file = AudioSegment.from_wav(file_name)
  

Комментарии:

1. временный файл среза -> что это такое и как он генерируется?

2. Привет @Gyan — Использование функции slice audio в pydub. Например: фрагмент через десять секунд после пятисекундного промежутка next_10_seconds = song[15000:25000]

3. Эта особенность связана с тем, что модуль stdlib audioop python не поддерживает 24-разрядный звук (до недавнего времени) — pydub преобразует 24-разрядные входные файлы в 32-разрядные, чтобы воспользоваться преимуществами функций stdlib audio

4. Спасибо, я посмотрю в audioop. Я добавил подпроцесс, в котором я конвертирую папку файлов в новый набор из 24-битных файлов. Технически это медленнее, но отлично подходит для моего проекта.