Lệnh Linux để nối các tệp âm thanh và xuất chúng thành ogg


10

Tôi cần những công cụ dòng lệnh nào để ghép một số tệp âm thanh và xuất chúng dưới dạng một ogg (và / hoặc mp3)?

Nếu bạn có thể cung cấp lệnh hoàn chỉnh để nối và xuất ra ogg, điều đó thật tuyệt vời.

Chỉnh sửa : Các tệp đầu vào (trong trường hợp của tôi, hiện tại) có wmađịnh dạng, nhưng lý tưởng là nó phải đủ linh hoạt để hỗ trợ một loạt các định dạng phổ biến.

Edit2 : Chỉ cần làm rõ, tôi không muốn hợp nhất tất cả wma s trong một thư mục nhất định, tôi chỉ muốn ghép 2 hoặc 3 tệp thành một.

Cảm ơn các giải pháp được đề xuất, nhưng tất cả chúng dường như đều yêu cầu tạo các tệp tạm thời, nếu có thể, tôi muốn tránh điều đó.


1
Những định dạng đầu vào nào bạn cần hỗ trợ?
John T

Về nguyên tắc, bạn có thể điều chỉnh tất cả các lệnh này thành đầu ra đường ống giữa nhau. Nhưng thực tế, đó là một nỗi đau để làm cho nó hoạt động, và một nỗi đau để gỡ lỗi khi nó thất bại. Có những cách thực tế để làm các tập tin tạm thời. Phương pháp ưa thích của tôi là sử dụng mktemp -d /tmp/descriptive_name.XXXXXXđể tạo một thư mục tạm thời với một tên thông tin, sau đó xử lý tất cả các tệp tạm thời của tôi trong đó, sau đó rm -r thư mục tạm thời sau đó.
Ryan C. Thompson

chỉ cần làm rõ, bất cứ điều gì hoạt động cho tất cả các wma trong một thư mục, bằng cách chỉ định *.wmatrong một dòng lệnh, chắc chắn sẽ hoạt động cho một danh sách nhỏ hơn như 1.wma 2.wma 3.wma 4.wma(loại bỏ 5.wma, 6.wma, & 7.wma), chỉ bằng cách liệt kê chúng ra như thế (thay vì sử dụng *.wma).
quack quixote

Câu trả lời:


9

Đây là gợi ý của tôi: Sử dụng mplayer và oggenc được kết nối với một đường ống có tên.

  • Sử dụng mplayerđể giải mã âm thanh. Nó có thể phát lại nhiều định dạng âm thanh (và video) và cũng có thể phát nhiều tệp.

  • Sử dụng oggencđể mã hóa âm thanh sang Ogg Vorbis.

  • Để loại bỏ sự cần thiết của một tệp tạm thời, sử dụng một đường ống có tên để chuyển dữ liệu giữa bộ mã hóa và bộ giải mã.

Đưa nó vào một kịch bản:

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

Giải thích:

  1. Lấy tên tệp đích từ tham số dòng lệnh đầu tiên.
  2. Xóa tham số dòng lệnh đầu tiên, chỉ để lại tên tệp nguồn.
  3. Tạo một tên cho một đường ống cho oggenc để đọc từ.
  4. Tạo một tên cho một đường ống để mplayer viết vào
  5. Tạo các đường ống.
  6. Sử dụng con mèo để liên tục đổ writepipe vào readpipe (điều này giúp tránh các vấn đề mà người chơi có thể chấm dứt, nhưng ngăn oggenc nghĩ rằng nó đã được thực hiện khi điều này xảy ra)
  7. Giải mã âm thanh từ các tệp nguồn bằng mplayer. Có các tùy chọn -really-quiet -slave -nolircđể tắt tin nhắn và làm cho nó không đọc được bàn phím hoặc điều khiển từ xa. Có các tùy chọn -vc null -vo nullđể tắt mã hóa video và đầu ra. Các -aotùy chọn hướng nó đến đầu ra âm thanh ở định dạng WAV với ống ghi tên.
  8. Trong khi lệnh trước đang chạy, đồng thời mã hóa từ ống đọc có tên vào Ogg bằng cách sử dụng oggenc.
  9. Loại bỏ các đường ống được đặt tên.

Công cụ bên trái để cải thiện: Chấm dứt tập lệnh sớm nếu một trong các lệnh không thành công (sử dụng set -e), nhưng vẫn dọn sạch fifo (bẫy các tín hiệu cần thiết).


Các chỉ "nhẹ" Vấn đề là có một âm thanh nhấp chuột giữa các tập tin
Hasen

@hasen j: nếu bạn muốn hoàn hảo, hãy sử dụng Audacity hoặc trình soạn thảo wav khác. nếu bạn có thể theo dõi nguồn của nhấp chuột, bạn có thể gửi thông báo lỗi về người vi phạm.
quack quixote

15

SoX có thể xử lý một số lượng lớn các định dạng âm thanh, tùy thuộc vào thư viện nào nó được biên dịch và có thể ghép các tệp bằng một dòng lệnh đơn giản

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

Tôi tin rằng điều này chỉ hoạt động nếu tất cả các tệp âm thanh nguồn có cùng số kênh, nhưng tôi chưa kiểm tra điều này.

Theo như tôi biết, SoX không hỗ trợ cho các tệp .wma, do đó, việc chuyển đổi ít nhất là các tệp có nội dung như ffmpeg trước tiên có lẽ là không thể tránh khỏi.

ffmpeg -i infile.wma outfile.wav

2
AFAIK sox chỉ hoạt động như vậy nếu tất cả các tệp có cùng kênh, tốc độ mẫu và độ sâu bit; nếu không bạn phải xác định cho tất cả. tôi đã không nhận ra rằng nó cũng sẽ giải mã các định dạng được mã hóa, nhưng tôi đoán rằng tôi đã không theo kịp nó.
quack quixote

3

Tôi sẽ sử dụng ffmpeg . Để chuyển đổi wma sang ogg vorbis hãy thử:

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

hoặc mp3:

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

bạn sẽ cần cài đặt què cho chuyển đổi mp3. sudo apt-get install lame libmp3lame0

Cat, sau đó chuyển đổi dường như không hoạt động tốt, mặc dù bạn có thể tìm thấy nhiều tài liệu tham khảo trên web nói rằng bạn có thể làm điều gì đó như cat *.wma | ffmpeg -i - -acodec ...- điều này không hoạt động trên máy của tôi - chỉ tệp đầu tiên được xử lý. Có một codec 'bản sao' cho ffmpeg, nhưng không tạo ra nhiều khác biệt.

Thực hiện chuyển đổi với ffmpeg trước, sau đó cat * .ogg> output.ogg làm việc cho tôi.


1
ok, còn ghép thì sao?
hasen

xin lỗi vì điều đó! Đọc bổ sung của tôi.
DaveParillo

không chắc chắn về ffmpeg ... tốt như một bộ giải mã WMA, nhưng rất nhiều phàn nàn về bộ mã hóa OGG. ít nhất là sử dụng -acodec libvorbisđể tránh bộ mã hóa dựng sẵn của ffmpeg.
quack quixote

3

Để nối và chuyển mã các tệp âm thanh, đây là quy trình công việc bạn muốn theo:

  1. Giải mã các tệp âm thanh đầu vào thành dữ liệu WAV / PCM,
  2. WAV kết hợp,
  3. Mã hóa WAV để xuất tập tin codec âm thanh.

Việc xử lý trong các bước này thực hiện việc ghép nối trên dữ liệu WAV, đây là cách dễ nhất để xử lý và ít mất mát nhất. Và vì dù sao bạn cũng muốn chuyển mã, bạn sẽ phải giải mã thành WAV ở đâu đó trong quy trình; cũng có thể tận dụng nó.

Dưới đây là các bước tôi khuyên bạn nên. Chúng tôi sẽ sử dụng ffmpegđể giải mã, soxghép nối và oggencmã hóa. Bạn có thể thay thế các công cụ khác cho bất kỳ bước nào - mencodervà các công cụ khác hoạt động tốt như một bộ giải mã và mọi công cụ mã hóa Ogg đều có thể được sử dụng làm bộ mã hóa - mặc dù tôi nghĩ bạn sẽ khó tìm được một công cụ tốt hơn so soxvới ghép nối.

  1. find *.wma -exec ffmpeg -i {} outfile.{}.wav \;
    (điều này chạy ffmpeg -i infile.wma outfile.infile.wmatrên mỗi tệp WMA trong thư mục hiện tại)

  2. sox outfile* all.wav
    (lưu ý outfilelà cùng một tiền tố chúng tôi đã cho các tệp đầu ra ở bước 1)

  3. oggenc all.wav all.ogg bạn có thể muốn một số cài đặt chất lượng ở đây, nhưng điều này sẽ cho mặc định chất lượng khá. Tôi không nhận được kết quả tôi thích ffmpeg, nhưng bạn có thể thích nó, vì vậy tôi đã bao gồm một ví dụ với ffmpeg bên dưới.

Lưu ý rằng soxlệnh sẽ không hoạt động chính xác trừ khi tất cả các tệp WAV có cùng định dạng - nếu một số là 22kHz và một số là 44.1kHz, chẳng hạn, bạn cần xác định chúng soxthông qua các chuyển đổi dòng lệnh và chỉ định định dạng nào bạn muốn đầu ra. Tôi không biết bất kỳ công cụ dòng lệnh nào có khả năng như soxđối với bước nối. Bạn thể xuất ra định dạng PCM thô ở bước 1 và sử dụng catcho bước 2, nhưng điều đó sẽ chỉ hoạt động nếu chúng ở cùng định dạng và bạn cần cực kỳ cụ thể cho cả bộ giải mã và bộ mã hóa của mình. định dạng họ nên mong đợi.

Mã hóa bằng ffmpeg: Rất nhiều bài đăng trên mạng 'phàn nàn rằng bộ mã hóa Vorbis dựng sẵn của ffmpeg không tốt lắm. Nếu phiên bản của bạn được xây dựng với sự hỗ trợ libvorbis, -acodec libvorbisthay vào đó hãy sử dụng . Dòng lệnh mẫu:

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

1

Không hoạt động đối với các tệp .ogg, nhưng mp3wrap có thể ghép nhiều tệp .mp3 thành một tệp. Vì vậy, từ dòng lệnh, bạn có thể làm một cái gì đó như thế này

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

Điều này sẽ sử dụng ffmpeg để chuyển đổi tất cả các tệp .wma của bạn thành .mp3, sau đó hợp nhất tất cả các tệp .mp3 thành một tệp duy nhất.


1

Mencoder có thể ghép và chuyển mã video mà không cần tệp tạm thời ( ví dụ tầm thường ở đây ). Có một đoạn script nổi xung quanh một nơi nào đó gọi là aconvert để lừa mencoder chỉ làm âm thanh (điều mà nó thường từ chối làm). Hai điều này kết hợp có vẻ như chúng sẽ đáp ứng yêu cầu của bạn.

Chỉnh sửa: Tôi tìm thấy aconvert.sh. Thật không may, nó chỉ được thiết kế để chuyển đổi một tệp âm thanh. Nhưng dù sao đây cũng là mã, trong trường hợp bất kỳ ai cũng muốn sử dụng nó để tạo một dòng lệnh chuyển đổi nhiều tệp âm thanh.

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

Nghĩ rằng tôi sẽ ném câu trả lời của mình vào. Đây có lẽ không phải là cách thanh lịch nhất, nhưng nó đã làm những gì tôi muốn.

Bước 1: Chuyển đổi sang OGG (sử dụng mplayer, pacplruby, tất cả có sẵn từ Repos Debian miễn phí tô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

Bước 2: nối các tệp ogg

cat *ogg > big-file.ogg

0

cat file list… | ffmpeg -f mp3 -i – -acodec copy outfile.mp3làm việc tốt với tôi với MP3: Tôi tưởng tượng nó cũng hoạt động với các định dạng khác. Tín dụng đi đến Lindylex .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.