10

Какие инструменты командной строки мне нужны, чтобы объединить несколько аудиофайлов и вывести их в виде одного ogg (и / или mp3)?

Если вы можете предоставить полную команду для объединения и вывода в ogg, это было бы здорово.

Изменить: Входные файлы (в моем случае, в настоящее время) в формате wma , но в идеале он должен быть достаточно гибким, чтобы поддерживать широкий спектр популярных форматов.

Edit2: просто чтобы уточнить, я не хочу объединять все wma в определенном каталоге, я просто хочу объединить 2 или 3 файла в один.

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

8 ответов8

15

SoX может обрабатывать большое количество аудиоформатов, в зависимости от того, с какими библиотеками он скомпилирован, и может объединять файлы с помощью простой командной строки

sox file1.wav file2.mp3 file3.flac outfile.ogg

Я считаю, что это работает, только если все исходные аудиофайлы имеют одинаковое количество каналов, но я не проверял это.

Насколько я знаю, SoX практически не поддерживает файлы .wma, поэтому преобразование хотя бы этих файлов с помощью чего-то вроде ffmpeg в первую очередь, вероятно, неизбежно.

ffmpeg -i infile.wma outfile.wav
9

Вот мое предложение: используйте mplayer и oggenc, связанные с именованным каналом.

  • Используйте mplayer для декодирования аудио. Он может воспроизводить широкий спектр аудио (и видео) форматов, а также может воспроизводить несколько файлов.

  • Используйте oggenc для кодирования аудио в Ogg Vorbis.

  • Чтобы устранить необходимость во временном файле, используйте именованный канал для передачи данных между кодером и декодером.

Поместить это в скрипт:

#!/bin/sh
# Usage: ./combine2ogg destination.ogg source1.wma source2.wma ...
# Requires: mplayer, oggenc
destination="$1"
shift
readpipe="$destination.tmpr"
writepipe="$destination.tmpw"
mkfifo "$readpipe"
mkfifo "$writepipe"
cat "$writepipe" > "$readpipe" &
mplayer -really-quiet -slave -nolirc -vc null -vo null -ao "pcm:fast:file=$writepipe" "$@" &
oggenc --quiet -o "$destination" "$readpipe"
rm -f "$readpipe"
rm -f "$writepipe"

Разъяснение:

  1. Возьмите имя файла назначения из первого параметра командной строки.
  2. Удалите первый параметр командной строки, оставив только имена исходных файлов.
  3. Создайте имя для канала для чтения из oggenc.
  4. Создайте имя для канала для mplayer для записи
  5. Создайте трубы.
  6. Используйте cat, чтобы непрерывно выгружать writepipe в readpipe (это помогает избежать проблем, при которых mplayer может завершиться, но не дает oggenc думать, что это сделано, когда это произойдет)
  7. Декодируйте аудио из исходных файлов, используя mplayer. Опции -really-quiet -slave -nolirc предназначены для отключения сообщений и запрета чтения с клавиатуры или пульта дистанционного управления. Опции -vc null -vo null предназначены для отключения кодирования и вывода видео. Опция -ao направляет его на вывод звука в формате WAV в именованный канал записи.
  8. Пока предыдущая команда выполняется, одновременно кодируйте из именованного канала чтения в Ogg с помощью oggenc.
  9. Удалить названные трубы.

Вещи слева направо для улучшения: преждевременное завершение сценария в случае сбоя одной из команд (используйте set -e), но при этом корректно очищает fifo (перехватывайте необходимые сигналы).

3

Я бы использовал ffmpeg. Чтобы конвертировать wma в ogg vorbis, попробуйте:

ffmpeg -i sample.wma -acodec vorbis -aq 100 sample.ogg

или mp3:

ffmpeg -i input.wma -acodec libmp3lame output.mp3

для конвертирования mp3 вам понадобится lame. sudo apt-get install lame libmp3lame0

Cat, тогда преобразование не очень хорошо работает, хотя в Интернете можно найти множество ссылок, в которых говорится, что вы можете сделать что-то вроде cat *.wma | ffmpeg -i - -acodec ... - это не работает на моей машине - обрабатывается только первый файл. Существует кодек для копирования ffmpeg, но он не имеет большого значения.

Сначала я выполнил конвертирование с помощью ffmpeg, а затем cat * .ogg> output.ogg.

3

Чтобы объединить и перекодировать аудиофайлы, вы должны следовать этому рабочему процессу:

  1. Декодировать входные аудиофайлы в данные WAV/PCM,
  2. Объединить WAV,
  3. Кодировать WAV для вывода файла аудиокодека.

Обработка на этих этапах выполняет конкатенацию данных WAV, с которой проще всего справиться и с наименьшими потерями. И поскольку вы все равно хотите транскодировать, вам придется декодировать в WAV где-то в процессе; может также воспользоваться этим.

Вот шаги, которые я рекомендую. Мы будем использовать ffmpeg для декодирования, sox для конкатенации и oggenc для кодирования. Вы можете заменить другие инструменты для любого шага - mencoder и другие прекрасно работают в качестве декодера, и любой инструмент, который кодирует Ogg, может быть использован в качестве кодера - хотя я думаю, что вам будет сложно найти лучший инструмент, чем sox для объединения.

  1. find *.wma -exec ffmpeg -i {} outfile.{}.wav \;
    (это запускает ffmpeg -i infile.wma outfile.infile.wma для каждого файла WMA в текущем каталоге)

  2. sox outfile* all.wav
    (обратите внимание, что outfile - это тот же префикс, который мы дали выходным файлам на шаге 1)

  3. oggenc all.wav all.ogg , возможно, вам нужны некоторые настройки качества, но это даст достойные значения по умолчанию. Я не получил результаты, которые мне понравились, с ffmpeg , но вы можете предпочесть его, поэтому я привел пример с ffmpeg ниже.

Обратите внимание, что команда sox не будет работать должным образом, если все файлы WAV не имеют одинаковый формат - например, если некоторые из них имеют частоту 22 кГц, а некоторые 44,1 кГц, вам необходимо идентифицировать их для sox помощью переключателей командной строки и указать, какой формат вы используете. хочу вывод в. Я не знаю каких-либо инструментов командной строки, способных использовать sox на этапе объединения. Вы могли бы вывести в необработанный формат PCM на шаге 1 и использовать cat для шага 2, но это сработало бы только в том случае, если они были в одном формате, и вам нужно было бы быть крайне специфичным для вашего декодера и кодера, чтобы какой формат они должны ожидать.

Кодирование с помощью ffmpeg. Многие посты в сети жалуются, что встроенный кодировщик Vorbis в ffmpeg не очень хорош. Если ваша версия создана с поддержкой libvorbis, используйте вместо -acodec libvorbis . Пример командной строки:

ffmpeg -i all.wav -acodec libvorbis -ac 2 -ab 128k all.ogg
1

Mencoder может объединять и транскодировать видео без временных файлов (тривиальный пример здесь). Там где-то есть скрипт, называемый aconvert, который заставляет mencoder делать только аудио (что обычно он не делает). Похоже, что эти две вещи будут соответствовать вашим требованиям.

Изменить: я нашел aconvert.sh. К сожалению, он предназначен только для преобразования одного аудиофайла. Но вот код в любом случае, на случай, если кто-то захочет использовать его для создания командной строки, которая преобразует несколько аудиофайлов.

#!/bin/sh

# Author: Jonas Jermann
# Description: A hack to allow mencoder to encode from an audio only file

if [ "$1" = "" ]; then
    echo "Usage: $0 <\"input file\"> <\"output file\"> <\"options\">"
    exit 0
fi

options=${3:-"-oac mp3lame"}

mencoder -demuxer rawvideo -rawvideo w=1:h=1 -ovc copy -of rawaudio -endpos `mplayer -identify $1 -frames 0 2>&1 | grep ID_LENGTH | cut -d "=" -f 2` -audiofile $1 -o $2 $options $1
1

Не работает для файлов .ogg, но mp3wrap может объединять несколько файлов .mp3 в один файл. Так что из командной строки вы можете сделать что-то вроде этого

for FILE in *.wma; do ffmpeg -i "$FILE" "`basename "$FILE" .wma`.mp3"; done
mp3wrap bigmp3_MP3WRAP.mp3 *.mp3

Он будет использовать ffmpeg для преобразования всех ваших файлов .wma в .mp3, а затем объединит все файлы .mp3 в один файл.

0

Это может быть не совсем то, что вам нужно, но это должно помочь http://bitzenbytes.com/index.php?name=PNphpBB2&file=viewtopic&t=6538&postdays=0&postorder=asc&sid=f87b364ddbae3ddd9417f5d10fae870c

0

Думал, что я добавлю свой ответ. Вероятно, это не самый элегантный способ, но он сделал то, что я хотел.

Шаг 1: преобразовать в ogg (использует mplayer , pacpl и ruby , все они доступны в бесплатных репозиториях Debian. Я)

#! /usr/bin/ruby

ARGV.each do |target|
  file_ext = target.scan(/\.\w*$/)[0]
  name = target.sub(file_ext, "")

  `mplayer -novideo -ao pcm:file="tmp.wav" "#{target}"`
  `pacpl -t ogg --outfile "#{name}" tmp.wav`
  `rm tmp.wav`
end

Шаг 2: объединить файлы OGG

cat *ogg > big-file.ogg

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .