Tambahkan keheningan ke akhir MP3

12

Apakah ada di antara Anda yang tahu cara menambahkan keheningan dengan durasi tetap ke akhir MP3, di Linux? Misalnya menggunakan MEncoder, FFmpeg, dll?

Itu harus berupa baris perintah karena akan dituliskan dan dijalankan di server kami.

Saya mencari di sekitar ini dan yang terbaik yang bisa saya lakukan adalah menggunakan padfungsi di SoX , tetapi itu tidak akan berfungsi dengan MP3.

Saya bisa mengonversinya menjadi WAV, menggunakan SoX, lalu mengonversinya kembali ke MP3 lagi dan menyalin metadata (minus durasinya) dari yang asli ke MP3 yang baru. Tapi, sebelum saya menulis skrip untuk itu saya pikir saya akan melihat apakah ada solusi satu-hit.

Max Williams
sumber
2
Saya pikir Anda dapat mencapai sesuatu seperti ini dengan mp3DirectCut (hanya Windows, tetapi mereka mengatakan itu kompatibel dengan Linux di bawah Wine), yang menghindari kompres ulang data suara. Jika Anda ingin MP3 -> WAV -> MP3, Anda akan mengkompres ulang aliran data terkompresi MP3 yang sudah ada, kehilangan banyak kualitas di jalan.
Terobosan
Terima kasih. Bisakah Anda menjalankan perangkat lunak windows melalui Wine dari baris perintah? Saya lebih suka menghindari solusi Wine jika memungkinkan karena saya enggan memasang Wine di server kami.
Max Williams
Hmm, Anda mungkin ingin menghindari rute Wine jika Anda belum memilikinya. Wine itu sendiri adalah unduhan yang cukup besar, jauh di atas satu atau dua megabyte untuk alat potong MP3 sederhana. Saya yakin ada solusi setara, Linux-asli. Jika saya menemukan alat tambahan, saya pasti akan memberi tahu Anda.
Terobosan

Jawaban:

9

Anda dapat melakukannya dengan mudah dengan padargumen SoX dan sintaks berikut:

sox <oldfile> <newfile> pad <silence at beginning of file> <silence at end of file>

Contoh:

sox mp3.mp3 mp3withsilence.mp3 pad 0 1

Keheningan itu dalam hitungan detik. (Penggunaan lain dimungkinkan menggunakan sintaks yang berbeda, sehingga dapat menyisipkan keheningan itu pada posisi tertentu. Lihat dokumentasi SoX untuk lebih lanjut.)

Fabien Snauwaert
sumber
Saya harus mencatat saya mengujinya OK dengan file MP3 (dengan libmad-0.dll dan libmp3lame-0.dll diinstal, masing-masing untuk decoding dan encoding MP3.) Sebisa mungkin, saya akan merekomendasikan bekerja dengan format lossless dan hanya mengkonversi ke MP3 di bagian akhir saja.
Fabien Snauwaert
itu sangat keren - terima kasih Fabien!
Max Williams
Apakah ini tanpa kerugian?
Geremia
Pembaruan: Saya membaca di manual sox yang dikonversi ke format internal kemudian disandikan ulang ...
Geremia
MP3 adalah format lossy. Pengkodean dan pengkodean ulang ke format lossy akan semakin menurunkan kualitas audio (apakah Anda mendengarnya atau tidak.) Dengan demikian, yang terbaik adalah bekerja dengan format lossless dan hanya mengkodekan ke format lossy sekali, pada akhirnya. Untuk daftar codec audio lossy: en.wikipedia.org/wiki/Lossy_compression#Audio dan untuk daftar codec audio lossless en.wikipedia.org/wiki/Lossless_compression#Audio
Fabien Snauwaert
15

Dengan ffmpeg, Anda dapat menggunakan filter aevalsrc untuk menghasilkan keheningan, dan kemudian dalam perintah kedua gunakan protokol concat untuk menggabungkannya tanpa kehilangan:

ffmpeg -filter_complex aevalsrc=0 -t 10 10SecSilence.mp3
ffmpeg -i "concat:input.mp3|10SecSilence.mp3" -c copy output.mp3

Anda dapat mengontrol lama kesunyian dengan mengubah -t 10waktu apa pun dalam detik yang Anda inginkan. Tentu saja, Anda hanya perlu menghasilkan keheningan sekali, maka Anda dapat menyimpan file di sekitar dan menggunakannya untuk membalut setiap file yang Anda inginkan. Anda juga mungkin ingin mencari demuxer concat - itu sedikit lebih intensif prosesor, tetapi Anda mungkin lebih mudah untuk masuk ke skrip shell.

Jika Anda ingin melakukannya dalam satu perintah, Anda dapat menggunakan filter concat - ini akan mengharuskan Anda untuk menyandikan ulang audio Anda (karena filtergraphs tidak kompatibel dengan -codec copy), sehingga opsi di atas mungkin yang terbaik untuk Anda. Tapi ini mungkin berguna bagi siapa saja yang bekerja dengan PCM mentah, ingin menambahkan keheningan sampai akhir sebelum menyandikan audio:

ffmpeg -i input.mp3 \
-filter_complex 'aevalsrc=0::d=10[silence];[0:a][silence]concat=n=2:v=0:a=1[out]' \
-map [out] -c:a libmp3lame -q:a 2 output.mp3

Kontrol panjang keheningan dengan mengubah d=10ke waktu apa pun (dalam detik) yang Anda inginkan. Jika Anda menggunakan metode ini, Anda mungkin menemukan panduan pengodean MP3 FFmpeg ini berguna.

Evilsoup
sumber
terima kasih @ evilsoup. Saya baru saja mencobanya dan mendapatkan yang berikut - max-thinkpad-linux: ~ $ ffmpeg -filter_complex aevalsrc = 0 -t 4,61 silence.mp3ffmpeg version 0.8.4-4:0.8.4-0ubuntu0.12.04.1, Copyright (c) 2000-2012 the Libav developers built on Nov 6 2012 16:51:33 with gcc 4.6.3 *** THIS PROGRAM IS DEPRECATED *** This program is only provided for compatibility and will be removed in a future release. Please use avconv instead. Unrecognized option 'filter_complex' Failed to set value 'aevalsrc=0' for option 'filter_complex'
Max Williams
@max Pertama-tama, Anda benar-benar menggunakan avconv dari proyek libav - mereka adalah garpu FFmpeg yang digunakan Debian & Ubuntu alih-alih proyek utama, dan mereka menyediakan versi ffmpeg yang lumpuh. Coba gunakan avconvsebagai gantinya - sintaksnya harus sama, ganti saja ffmpegdengan avconv.
evilsoup
Jika itu tidak berhasil, cobalah memutakhirkan ke versi ffmpeg yang lebih baru. Karena Anda menggunakan Ubuntu, Anda harus dapat menggunakan PPA ini , atau untuk versi terbaru Anda dapat mengompilasinya dari sumber .
Evilsoup
1
@ MaxWilliams Atau Anda dapat mengunduh build statis , yang tidak harus Anda kompilasi terlebih dahulu. Cukup unduh, ekstrak, gunakan.
slhck
1
untuk referensi di masa mendatang: jika Anda menghadapi kesalahan seperti saya, coba ganti tanda kutip tunggal dengan tanda kutip ganda
SZT