คำสั่ง Linux เพื่อต่อไฟล์เสียงและต่อไฟล์เข้ากับ ogg


10

เครื่องมือบรรทัดคำสั่งใดที่ฉันต้องการเพื่อเชื่อมไฟล์เสียงหลายไฟล์และส่งออกเป็นไฟล์ ogg (และ / หรือ mp3)

หากคุณสามารถให้คำสั่งที่สมบูรณ์ในการเชื่อมต่อและส่งออกไปยัง ogg นั่นจะยอดเยี่ยม

แก้ไข : ไฟล์อินพุต (ในกรณีของฉันในปัจจุบัน) อยู่ในwmaรูปแบบ แต่ควรมีความยืดหยุ่นเพียงพอที่จะรองรับรูปแบบที่เป็นที่นิยมมากมาย

แก้ไข 2 : เพื่อชี้แจงฉันไม่ต้องการรวมทั้งหมด wmaในไดเรกทอรีบางอย่างฉันแค่ต้องการเชื่อม 2 หรือ 3 ไฟล์เป็นหนึ่งเดียว

ขอบคุณสำหรับโซลูชันที่นำเสนอ แต่ดูเหมือนว่าพวกเขาทั้งหมดต้องการสร้างไฟล์ชั่วคราวถ้าเป็นไปได้เลยฉันต้องการหลีกเลี่ยงปัญหานั้น


1
คุณต้องการการสนับสนุนรูปแบบอินพุตใด
John T

โดยหลักการคุณสามารถปรับแต่งคำสั่งเหล่านี้ทั้งหมดไปยังเอาต์พุตท่อระหว่างกันได้ แต่ในทางปฏิบัติมันเป็นความเจ็บปวดที่ทำให้มันทำงานได้และความเจ็บปวดในการดีบั๊กเมื่อมันล้มเหลว มีวิธีปฏิบัติในการทำไฟล์ temp วิธีที่ฉันต้องการคือการใช้mktemp -d /tmp/descriptive_name.XXXXXXเพื่อสร้างไดเรกทอรีชั่วคราวด้วยชื่อข้อมูลจากนั้นประมวลผลไฟล์ชั่วคราวทั้งหมดของฉันในนั้นจากนั้น rm -r temp dir หลังจากนั้น
ไรอันซี ธ อมป์สัน

เพื่อชี้แจงสิ่งใดที่เหมาะกับwma ทั้งหมดในไดเรกทอรีโดยการระบุ*.wmaใน commandline จะทำงานกับรายการขนาดเล็กเช่น1.wma 2.wma 3.wma 4.wma(โดยไม่ต้องออก 5.wma, 6.wma, & 7.wma) เพียงแค่เขียนมันออกมา เช่นนั้น (แทนที่จะใช้*.wma)
ต้มตุ๋น Quixote

คำตอบ:


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 ในการดัมพ์ readpipe ไปยัง readpipe อย่างต่อเนื่อง (ซึ่งจะช่วยหลีกเลี่ยงปัญหาที่ mplayer อาจยุติ แต่ป้องกันไม่ให้ oggenc คิดว่ามันทำเมื่อสิ่งนี้เกิดขึ้น)
  7. ถอดรหัสเสียงจากไฟล์ต้นฉบับโดยใช้ mplayer -really-quiet -slave -nolircมีตัวเลือกเพื่อปิดการใช้งานข้อความและเพื่อไม่ให้อ่านคีย์บอร์ดหรือรีโมท -vc null -vo nullมีตัวเลือกเพื่อปิดใช้งานการเข้ารหัสวิดีโอและเอาท์พุท -aoตัวเลือกชี้นำการส่งออกเสียงในรูปแบบ WAV ไปยังท่อเขียนชื่อ
  8. ในขณะที่คำสั่งก่อนหน้านี้กำลังรันให้เข้ารหัสพร้อมกันจากไปป์อ่านที่มีชื่อใน Ogg โดยใช้ oggenc
  9. ลบชื่อไปป์

สิ่งที่เหลือไว้สำหรับการปรับปรุง: การยกเลิกสคริปต์ก่อนหากคำสั่งใดคำสั่งหนึ่งล้มเหลว (ใช้งานset -e) แต่ยังคงล้างข้อมูลทั้งห้าอย่างถูกต้อง (ดักสัญญาณที่จำเป็น)


เพียงปัญหา "เล็กน้อย" คือมีความเสียงคลิกระหว่างไฟล์
Hasen

@hasen j: ถ้าคุณต้องการความสมบูรณ์แบบให้ใช้ความกล้าหรือ wav-editor อื่น หากคุณสามารถติดตามแหล่งที่มาของการคลิกคุณสามารถยื่นรายงานข้อผิดพลาดบนผู้กระทำความผิด
ต้มตุ๋น Quixote

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

แคทแปลงแล้วดูเหมือนจะใช้งานไม่ได้ถึงแม้ว่าคุณจะพบการอ้างอิงจำนวนมากบนเว็บว่าคุณสามารถทำอะไรบางอย่างเช่นcat *.wma | ffmpeg -i - -acodec ...- มันไม่ทำงานบนเครื่องของฉัน - เฉพาะไฟล์แรกที่ได้รับการประมวลผล มีตัวแปลงสัญญาณ 'คัดลอก' สำหรับ ffmpeg แต่ไม่ได้สร้างความแตกต่างมากนัก

ทำการแปลงด้วย ffmpeg ก่อนจากนั้น cat * .ogg> output.ogg ทำงานให้ฉัน


1
ตกลงสิ่งที่เกี่ยวกับการเรียงต่อกัน?
hasen

ขอโทษด้วยกับเรื่องนั้น! อ่านเพิ่มเติมของฉัน
DaveParillo

ไม่แน่ใจเกี่ยวกับ ffmpeg ... ดีเป็นตัวถอดรหัส WMA แต่มีข้อร้องเรียนมากมายเกี่ยวกับตัวเข้ารหัส OGG อย่างน้อยใช้-acodec libvorbisเพื่อหลีกเลี่ยงการเข้ารหัส builtin ของ ffmpeg
ต้มตุ๋น Quixote

3

หากต้องการเชื่อมต่อและแปลงไฟล์เสียงนี่เป็นเวิร์กโฟลว์ที่คุณต้องการติดตาม:

  1. ถอดรหัสไฟล์เสียงอินพุตเป็นข้อมูล WAV / PCM
  2. เชื่อมต่อ WAV
  3. เข้ารหัส WAV เพื่อส่งออกไฟล์ตัวแปลงสัญญาณเสียง

การประมวลผลในขั้นตอนเหล่านี้จะทำการเชื่อมต่อข้อมูล WAV ซึ่งเป็นวิธีที่ง่ายที่สุดในการจัดการและสูญเสียน้อยที่สุด และเนื่องจากคุณต้องการแปลงรหัสอยู่แล้วคุณจะต้องถอดรหัสเป็น WAV ในกระบวนการ อาจรวมถึงใช้ประโยชน์จากมัน

นี่คือขั้นตอนที่ฉันแนะนำ เราจะใช้ffmpegสำหรับการถอดรหัสsoxเพื่อการต่อข้อมูลและoggencการเข้ารหัส คุณสามารถใช้แทนเครื่องมืออื่น ๆ สำหรับขั้นตอนใด ๆ - mencoderและอื่น ๆ ทำงานได้ดีเป็นตัวถอดรหัสและเครื่องมือใด ๆ ที่ encodes 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 ทั้งหมดจะอยู่ในรูปแบบเดียวกัน - หากบางไฟล์เป็น 22kHz และบางส่วนเป็น 44.1kHz คุณจะต้องระบุไฟล์เหล่านั้นsoxผ่านสวิตช์ commandline และระบุรูปแบบที่คุณต้องการ ออกมาฉันไม่รู้เครื่องมือ commandline ใด ๆ ที่มีความสามารถพอ ๆsoxกับขั้นตอนการต่อข้อมูล คุณสามารถส่งออกไปยังรูปแบบ PCM แบบดิบในขั้นตอนที่ 1 และใช้catสำหรับขั้นตอนที่ 2 แต่นั่นจะใช้ได้เฉพาะในกรณีที่อยู่ในรูปแบบเดียวกันเท่านั้นและคุณต้องมีความเฉพาะเจาะจงมากสำหรับทั้งตัวถอดรหัสและตัวเข้ารหัสของคุณ รูปแบบที่พวกเขาควรคาดหวัง

การเข้ารหัสด้วย ffmpeg: มีโพสต์มากมายรอบ ๆ 'net บ่นว่า encoder Vorbis ในตัวของ ffmpeg นั้นไม่ค่อยดีนัก หากเวอร์ชันของคุณถูกสร้างขึ้นด้วยการสนับสนุน libvorbis ให้ใช้-acodec libvorbisแทน ตัวอย่าง commandline:

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 สามารถต่อเชื่อมและแปลงรหัสวิดีโอโดยไม่มีไฟล์ temp ( ตัวอย่างเล็กน้อยที่นี่ ) มีสคริปต์ที่ลอยอยู่รอบ ๆ บางแห่งที่เรียกว่า 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ทั้งหมดที่มีอยู่จาก Repos 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

0

cat file list… | ffmpeg -f mp3 -i – -acodec copy outfile.mp3ทำงานได้ดีสำหรับฉันกับ MP3: ฉันคิดว่ามันจะทำงานกับรูปแบบอื่นเช่นกัน เครดิตไปLindylex

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.