Команда Linux для объединения аудиофайлов и вывода их в ogg


10

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

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

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

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

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


1
Какие форматы ввода вам нужна поддержка?
Джон Т

В принципе, вы можете настроить все эти команды для передачи вывода между собой. Но на практике это боль в том, чтобы заставить его работать, и боль в том, чтобы отлаживать, когда он терпит неудачу. Есть практические способы сделать временные файлы. Мой предпочтительный метод - использовать mktemp -d /tmp/descriptive_name.XXXXXXдля создания временного каталога с информативным именем, затем обрабатывать все мои временные файлы там, а затем rm -r временный каталог.
Райан Томпсон

просто чтобы уточнить, все, что работает для всех wma в каталоге, путем указания *.wmaв командной строке, безусловно, будет работать для меньшего списка, например 1.wma 2.wma 3.wma 4.wma(пропуская 5.wma, 6.wma и 7.wma), просто перечислив их так (вместо того, чтобы использовать *.wma).
шарлатан-кихот

Ответы:


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 (перехватывайте необходимые сигналы).


Единственная «небольшая» проблема - это звук щелчка между файлами
hasen

@hasen j: если вы хотите совершенный, используйте Audacity или другой wav-редактор. если вы можете отследить источник клика, вы можете отправить отчет об ошибке на нарушителя.
Квик-кихот

15

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

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

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

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

ffmpeg -i infile.wma outfile.wav

2
AFAIK sox работает только так, если все файлы имеют одинаковые каналы, частоту дискретизации и битовую глубину; в противном случае вы должны указать для всех. я не понимал, что это будет декодировать и закодированные форматы, но, думаю, я не поспеваю за этим.
шарлатан Quixote

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 *.wma | ffmpeg -i - -acodec ...- это не работает на моей машине - обрабатывается только первый файл. Для ffmpeg есть кодек «copy», но особой разницы нет.

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


1
хорошо, а как насчет объединения?
hasen

Извини за это! Прочитайте мои дополнения.
DaveParillo

не очень уверен насчет ffmpeg ... отлично, как WMA-декодер, но много жалоб на кодер OGG. по крайней мере, используйте, -acodec libvorbisчтобы избежать встроенного кодировщика ffmpeg.
шарлатанство

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

Не работает для файлов .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 в один файл.


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


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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.