Склейка нескольких wav файлов в один wav или m3 с разными sample rate
Необходимо склеить несколько wav файлов в один mp3/wav (в зависимости от настроек).
Проблемы:
Входные файлы имеют разные частоты дискретизации (22,1 - 24 кГц)
Если выходной файл - mp3, его частоты необходимо поднять до 32кГц, иначе в нем появится небольшой писк (из-за сжатия видимо)
Да, я осведомлен о SoX и ffmpeg. Но SoX не решает 1 проблему, а ffmpeg - вторую.
ffmpeg -i input0.wav -i input1.wav -i input2.wav -filter_complex '[0:0][1:0][2:0]concat=n=3:v=0:a=1[out]' -map '[out]' -ar 32000 output.mp3
sox input0.wav input1.wav input2.wav -r 32000 output.mp3
Вот эти консольные команды я юзал. С ffmpeg на первый взгляд все хорошо, но почему-то на одном компе работает исправно, а на другом частеько выкидывает Invalid sample rate: -1. Если кто знает, как решить проблему с этими двумя программами или посоветует новую, которая этих недостатков лишена (любую - консольная или шустрая либа на python), то буду очень признателен.
Ответы (1 шт):
А если
sox input0.wav input1.wav input2.wav -r 32000 --type wav - | ffmpeg -f wav -i pipe: output.mp3
Извращение конечно.
Лучше попробуйте gstreamer
gst-launch-1.0 -e --gst-debug-level=2 concat name=c ! lamemp3enc ! filesink location=output.mp3 \
filesrc location=LongWelcome.wav ! wavparse ! c. \
filesrc location=Welcome.wav ! wavparse ! c. \
filesrc location=LongWelcome.wav ! wavparse ! c.
По поводу частоты. Контейнер mp3 похоже может содержать куски с разной частотой, гстример их похоже так и укладывает или lame ресамплит по первому куску. Писка я не заметил. Можно указать через capsfilter нужную частоту и добавить ресамплер:
... audioresample ! audioconvert ! audio/x-raw,format=S16LE,rate=32000 ! lamemp3enc ...
В итоге
gst-launch-1.0 concat name=c \
! audioresample ! audioconvert ! audio/x-raw,rate=32000,channels=1 \
! lamemp3enc ! filesink location=output.mp3 \
filesrc location=LongWelcome.wav ! wavparse ! c. \
filesrc location=Welcome.wav ! wavparse ! c. \
filesrc location=LongWelcome.wav ! wavparse ! c.
А вот юниксвэй:
Можно каждый файл сжать в mp3 отдельно, а потом слепить в один.
lame input0.wav input0.mp3
lame input1.wav input1.mp3
lame input2.wav input2.mp3
cat input*.mp3 > out.mp3
https://stackoverflow.com/q/62618/2101808 но лучше через mp3wrap