Команда Linux об'єднує аудіофайли та виводить їх у ogg


10

Які інструменти командного рядка мені потрібні для об'єднання декількох аудіофайлів та виведення їх у вигляді одного ogg (та / або mp3)?

Якщо ви можете надати повну команду для об'єднання та виведення в ogg, це було б приголомшливо.

Редагувати : вхідні файли (в моєму випадку зараз) у wmaформаті, але в ідеалі він повинен бути досить гнучким для підтримки широкого кола популярних форматів.

Edit2 : Просто для уточнення, я не хочу об'єднати всі wma s у певний каталог, я просто хочу об'єднати 2 або 3 файли в один.

Дякую за запропоновані рішення, але всі вони, здається, вимагають створення тимчасових файлів, якщо це можливо взагалі, я хотів би цього уникнути.


1
для яких форматів введення потрібна підтримка?
Джон Т

У принципі, ви можете налаштувати всі ці команди, щоб виводити між собою дані. Але практично це біль, щоб змусити його працювати, і біль налагодити, коли він не вдається. Існують практичні способи зробити тимчасові файли. Моїм кращим методом є використання mktemp -d /tmp/descriptive_name.XXXXXXтимчасового каталогу з інформативним іменем, потім обробка всіх моїх тимчасових файлів, а потім rm -r temp dir.
Райан К. Томпсон

просто для уточнення, що все, що працює для всіх wma в каталозі, вказавши *.wmaв командному 1.wma 2.wma 3.wma 4.wmaрядку, безумовно, буде працювати для меншого списку на кшталт (залишаючи 5wma, 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. Використовуйте кішку для постійного скидання труби запису на передавальну трубу (це допомагає уникнути проблем, коли mplayer може закінчитися, але заважає oggenc думати, що це робиться, коли це станеться)
  7. Розшифруйте аудіо з вихідних файлів за допомогою mplayer. Є варіанти -really-quiet -slave -nolirc, щоб відключити повідомлення та зробити так, щоб вони не читали клавіатуру чи пульт. Є параметри -vc null -vo nullдля відключення кодування відео та виведення. Цей -aoпараметр спрямовує його на виведення звуку у форматі WAV на названу трубку запису.
  8. Поки виконується попередня команда, одночасно кодуйте з названого каналу читання в Ogg за допомогою oggenc.
  9. Видаліть названі труби.

Речі вліво для вдосконалення: припинення сценарію достроково, якщо одна з команд не вдасться (використовувати set -e), але все-таки належним чином очищає фіфо (захоплює необхідні сигнали).


Єдина "незначна" проблема полягає в тому, що звук клацання між файлами
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 працює лише так, якщо всі файли мають однакові канали, швидкість вибірки та глибину бітів; інакше вам потрібно вказати для всіх. Я не усвідомлював, що це також буде декодувати закодовані формати, але я гадаю, що не встигав за цим.
крякав кіхот

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. sudo apt-get install lame libmp3lame0

Cat, тоді конвертування, здається, не працює добре, хоча в Інтернеті ви можете знайти багато посилань, які говорять про те, що ви можете зробити щось на кшталт cat *.wma | ffmpeg -i - -acodec ...- це не працює на моїй машині - обробляється лише перший файл. Існує "копіювати" кодек для ffmpeg, але це не має великої різниці.

Спершу робимо перетворення з ffmpeg, потім мені працював кіт * .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: Дуже багато публікацій навколо мережі скаржаться на те, що вбудований ffmpeg кодер Vorbis не дуже добре. Якщо ваша версія побудована з підтримкою 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, який наводить підказки робити мультимедіа лише для аудіо (що зазвичай відмовляється робити). Ці дві речі у поєднанні здаються такими, що вони задовольнять ваші вимоги.

Редагувати: я знайшов 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.