Comando Linux para concatenar archivos de audio y enviarlos a ogg

10

¿Qué herramientas de línea de comandos necesito para concatenar varios archivos de audio y generarlos como un ogg (y / o mp3)?

Si puede proporcionar el comando completo para concatenar y enviar a ogg, sería increíble.

Editar : los archivos de entrada (en mi caso, actualmente) están en wmaformato, pero idealmente deberían ser lo suficientemente flexibles como para admitir una amplia gama de formatos populares.

Edit2 : solo para aclarar, no quiero fusionar todos wma los correos electrónicos en un determinado directorio, solo quiero concatenar 2 o 3 archivos en uno.

Gracias por las soluciones propuestas, pero todas parecen requerir la creación de archivos temporales, si es posible, me gustaría evitarlo.

Hasen
fuente
1
¿para qué formatos de entrada necesita soporte?
John T
En principio, puede ajustar todos estos comandos para canalizar la salida entre ellos. Pero prácticamente, es un dolor hacer que funcione, y un dolor para depurar cuando falla. Hay formas prácticas de hacer archivos temporales. Mi método preferido es usar mktemp -d /tmp/descriptive_name.XXXXXXpara crear un directorio temporal con un nombre informativo, luego procesar todos mis archivos temporales allí, luego rm -r el directorio temporal después.
Ryan C. Thompson el
solo para aclarar, cualquier cosa que funcione para todos los wma en un directorio, al especificar *.wmaen una línea de comandos, ciertamente funcionará para una lista más pequeña como 1.wma 2.wma 3.wma 4.wma(excluyendo 5.wma, 6.wma y 7.wma), simplemente al enumerarlos así (en lugar de usar *.wma).
quack quijote

Respuestas:

9

Aquí está mi sugerencia: use mplayer y oggenc conectados con una tubería con nombre.

  • Use mplayerpara decodificar el audio. Puede reproducir una amplia variedad de formatos de audio (y video), y también puede reproducir múltiples archivos.

  • Use oggencpara codificar el audio a Ogg Vorbis.

  • Para eliminar la necesidad de un archivo temporal, use una tubería con nombre para transferir los datos entre el codificador y el decodificador.

Poniendo eso en un script:

#!/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"

Explicado:

  1. Tome el nombre del archivo de destino del primer parámetro de línea de comando.
  2. Elimine el primer parámetro de línea de comando, dejando solo los nombres de los archivos de origen.
  3. Cree un nombre para una tubería para que oggenc lea.
  4. Cree un nombre para una tubería para que mplayer escriba
  5. Crea las tuberías.
  6. Use cat para volcar continuamente el tubo de escritura en el tubo de lectura (esto ayuda a evitar problemas en los que mplayer puede terminar, pero evita que oggenc piense que se hace cuando esto sucede)
  7. Decodifica el audio de los archivos fuente usando mplayer. -really-quiet -slave -nolircExisten opciones para deshabilitar los mensajes y hacer que no lea el teclado o el control remoto. -vc null -vo nullHay opciones para deshabilitar la codificación y salida de video. La -aoopción lo dirige a emitir el audio en formato WAV a la tubería de escritura nombrada.
  8. Mientras se ejecuta el comando anterior, codifique simultáneamente desde la canalización de lectura nombrada en Ogg usando oggenc.
  9. Eliminar las tuberías con nombre.

Cosas a la izquierda para mejorar: terminar el script antes de tiempo si falla uno de los comandos (usar set -e), pero aún así limpiar adecuadamente el fifo (atrapar las señales necesarias).

Jukka Matilainen
fuente
La única "ligero" problema es que hay un sonido de clic entre los archivos
Hasen
@hasen j: si quieres perfecto, usa Audacity u otro editor de wav. Si puede rastrear la fuente del clic, puede presentar un informe de error al infractor.
quack quijote
15

SoX puede manejar una gran cantidad de formatos de audio, dependiendo de las bibliotecas con las que se compila, y puede concatenar archivos con una simple línea de comando

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

Creo que esto solo funciona si todos los archivos de audio de origen tienen la misma cantidad de canales, pero no lo he probado.

Hasta donde yo sé, SoX no tiene soporte para archivos .wma, por lo que la conversión de al menos esos archivos con algo como ffmpeg primero es probablemente inevitable.

ffmpeg -i infile.wma outfile.wav
goldPseudo
fuente
2
AFAIK sox solo funciona así si todos los archivos tienen los mismos canales, frecuencia de muestreo y profundidad de bits; de lo contrario, debe especificar para todos. No me di cuenta de que también decodificaría formatos codificados, pero supongo que no lo he estado siguiendo.
quack quijote
3

Yo usaría ffmpeg . Para convertir wma a ogg vorbis intente:

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

o mp3:

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

necesitará lame instalado para la conversión de mp3. sudo apt-get install lame libmp3lame0

Cat, luego convertir no parece funcionar bien, aunque puedes encontrar muchas referencias en la web que dicen que puedes hacer algo como cat *.wma | ffmpeg -i - -acodec ...esto, esto no funciona en mi máquina, solo se procesa el primer archivo. Hay un códec de 'copia' para ffmpeg, pero no hace mucha diferencia.

Hacer la conversión con ffmpeg primero, luego cat * .ogg> output.ogg funcionó para mí.

DaveParillo
fuente
1
ok, ¿qué pasa con la concatenación?
hasen
¡Lo siento por eso! Lee mis adiciones.
DaveParillo el
No estoy tan seguro sobre ffmpeg ... bien como un decodificador WMA, pero hay muchas quejas sobre el codificador OGG. al menos se usa -acodec libvorbispara evitar el codificador incorporado de ffmpeg.
quack quijote
3

Para concatenar y transcodificar archivos de audio, este es el flujo de trabajo que desea seguir:

  1. Decodificar archivos de audio de entrada a datos WAV / PCM,
  2. Concatenate WAV,
  3. Codifique WAV para generar un archivo de códec de audio.

El procesamiento en estos pasos lleva a cabo la concatenación de los datos WAV, que es la más fácil de manejar y la que tiene menos pérdidas. Y dado que de todos modos desea transcodificar, deberá decodificar a WAV en algún lugar del proceso; bien podría aprovecharlo.

Aquí están los pasos que recomiendo. Lo usaremos ffmpegpara decodificar, soxpara concatenación y oggencpara codificar. Puede sustituir otras herramientas por cualquier paso, mencodery otras funcionan bien como decodificador, y cualquier herramienta que codifique Ogg puede usarse como codificador, aunque creo que le será difícil encontrar una herramienta mejor que soxpara el concatenación.

  1. find *.wma -exec ffmpeg -i {} outfile.{}.wav \;
    (esto se ejecuta ffmpeg -i infile.wma outfile.infile.wmaen cada archivo WMA en el directorio actual)

  2. sox outfile* all.wav
    (nota outfilees el mismo prefijo que le dimos a los archivos de salida en el paso 1)

  3. oggenc all.wav all.ogg probablemente desee algunas configuraciones de calidad aquí, pero esto dará valores predeterminados de calidad decentes. No obtuve resultados que me gustaron ffmpeg, pero es posible que lo prefiera, así que he incluido un ejemplo con ffmpeg a continuación.

Tenga en cuenta que el soxcomando no funcionará correctamente a menos que todos los archivos WAV tengan el mismo formato; si algunos son de 22 kHz y otros de 44.1 kHz, por ejemplo, debe identificarlos soxmediante los interruptores de línea de comandos y especificar qué formato desea que salida. No conozco ninguna herramienta de línea de comandos tan capaz como soxpara el paso de concatenación. Usted podría , posiblemente, la salida a un formato PCM sin procesar en el paso 1 y el uso catpara el paso 2, pero que lo haría sólo funcionan si están en el mismo formato, y que había necesidad de ser muy específicos tanto para el descodificador y codificador en cuanto a lo formato que deben esperar.

Codificación con ffmpeg: muchas publicaciones en la red se quejan de que el codificador Vorbis incorporado de ffmpeg no es muy bueno. Si su versión está construida con soporte para libvorbis, use -acodec libvorbisen su lugar. Línea de comando de muestra:

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

No funcionará para archivos .ogg, pero mp3wrap puede concatenar múltiples archivos .mp3 en un solo archivo. Entonces, desde la línea de comando, podrías hacer algo como esto

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

Esto usará ffmpeg para convertir todos sus archivos .wma a .mp3, y luego combinar todos los archivos .mp3 en un solo archivo.

goldPseudo
fuente
1

Mencoder puede concatenar y transcodificar videos sin archivos temporales ( ejemplo trivial aquí ). Hay un script flotando en algún lugar llamado aconvert que engaña a mencoder para que solo haga audio (que normalmente se niega a hacer). Estas dos cosas combinadas parecen satisfacer sus necesidades.

Editar: encontré aconvert.sh. Desafortunadamente, solo está diseñado para convertir un archivo de audio. Pero aquí está el código de todos modos, en caso de que alguien quiera usarlo para crear una línea de comando que convierta múltiples archivos de audio.

#!/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
Ryan C. Thompson
fuente
0

Pensé en tirar mi respuesta. Probablemente esta no sea la forma más elegante, pero hizo lo que quería.

Paso 1: convertir a OGG (usos mplayer, pacply ruby, todas disponibles en los repositorios libres Debian I).

#! /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

Paso 2: concatenar archivos ogg

cat *ogg > big-file.ogg
Inaimathi
fuente
0

cat file list… | ffmpeg -f mp3 -i – -acodec copy outfile.mp3funcionó muy bien para mí con MP3: imagino que también funcionaría con otros formatos. Los créditos van a Lindylex .

Tomislav Nakic-Alfirevic
fuente