Konversi mp3 ke wav menggunakan FFmpeg untuk VBR

27

Perintah apa yang harus saya gunakan untuk mengonversi mp3file wavyang bitrate-nya variabel. Atau lebih baik bagaimana saya tahu apakah sumber audio itu fixedbitrate atau variable?

Soham Dasgupta
sumber
3
Saya tidak berpikir format file WAV mendukung laju bit variabel. Karena semua decoder MP3 harus mendukungnya agar sesuai dengan standar, Anda harus dapat mengonversi file MP3 apa pun menjadi WAV dengan bitrate tetap, meskipun hasil Anda akan bervariasi tergantung pada kualitas sumber MP3 dan bitrate tetap yang dipilih untuk WAV dibuat. Sebagian besar perangkat lunak pemutar MP3 menyediakan cara untuk melihat properti file yang sedang diputar, sehingga Anda dapat menggunakannya untuk melihat jenis file sumber yang Anda hadapi.
martineau
Dan bagaimana dengan perintahnya? Apa yang kamu sarankan?
Soham Dasgupta
Silakan baca jawaban martineau lagi. Saya memperbaiki beberapa kesalahan. Khususnya, Anda tidak dapat mengatur bitrate untuk file WAV yang dikodekan PCM.
slhck

Jawaban:

36

Anda bisa mendapatkan info tentang bitrate file input Anda dengan menggunakan ffprobe song.mp3perintah. Namun ini hanya memberi tahu Anda bitrate dari frame pertama. VBR dalam file MP3 biasanya diimplementasikan hanya dengan mengubah bitrate untuk setiap frame, jadi apakah itu digunakan tidak dapat ditentukan hanya dengan membaca header dari frame pertama. Saya biasanya menggunakan beberapa perangkat lunak pemutar file audio lainnya untuk menentukan apakah VBR sedang digunakan, karena banyak yang akan menampilkannya (misalnya Foobar2000).

Ketika Anda menggunakan codec output lossy (seperti MPEG-1 Layer III atau AAC), ffmpeg memilih bitrate default untuk aliran output, atau bitrate variabel. Itu tergantung pada encoder itu sendiri.

Untuk codec lossless, Anda tidak dapat mengatur bitrate variabel, karena setiap sampel mengambil jumlah bit yang telah ditentukan. ffmpeg -i song.mp3 song.wavkarena itu akan memberi Anda file WAV yang dikodekan PCM dengan laju sampel 44.100 Hz dan 16 bit per sampel. Ini menghasilkan sekitar 1411 kBit / s untuk seluruh wadah, kemungkinan jauh lebih besar dari file input MP3.

Jika Anda menginginkan ukuran file yang lebih kecil untuk file WAV yang dikodekan PCM, tetapkan format sampel dengan kedalaman bit lebih sedikit (lihat -encodersopsi untuk daftar lengkapnya) dan / atau pilih laju sampel yang lebih rendah (misalnya, -ar 22050akan menggunakan 22,05 kHz).

Berikut ini contoh melakukan keduanya:

ffmpeg -i song.mp3 -acodec pcm_u8 -ar 22050 song.wav
martineau
sumber
5
Jika Anda menyandikan audio PCM dalam wadah WAV, Anda tidak dapat mengatur bitrate. Itu tidak masuk akal. PCM adalah format yang tidak terkompresi - Anda tidak bisa mengatakannya untuk menggunakan bit lebih banyak atau lebih sedikit per detik. Satu-satunya cara untuk menyesuaikan ukuran adalah dengan menggunakan ukuran sampel yang berbeda (lihat -sample_fmtsopsi). -ar 128kberarti bahwa laju sampel akan 128.000 Hz, bukan 44,1 atau 48 kHz biasa.
slhck
12
Anda mungkin lebih baik melakukannya ffmpeg -i song.mp3 song.wav, karena itu akan memilih bitrate yang sesuai (yang mungkin 44.1khz). Jika Anda mengonversi ke wav, Anda mungkin tidak ingin kehilangan informasi lebih lanjut ..
naught101
@ naught101 benar, infact lebih baik membiarkan ffpmeguntuk memilih bitrate sampling yang tepat sesuai dengan song.mp3data input. Dengan cara ini wavfile bitmap keluaran akan memiliki bitrate terbaik. Ini berarti btw bahwa ukuran file akan menjadi besar, tetapi dengan overfitting data: `Streaming # 0: 0: Audio: mp3, 44100 Hz, stereo, s16p, 128 kb / s`
loretoparisi
1
Cukup aman untuk mengasumsikan, tujuan si penanya adalah untuk membakar file WAV yang dihasilkan ke CD audio. Satu-satunya frekuensi yang cocok untuk itu adalah 44100 Hz, jadi -ar 44100adalah suatu keharusan bahkan jika ffmpeg secara otomatis akan menggunakan codec 16-bit yang sesuai.
Mikhail T.
3

Menurut komentar @ naught101, saya akan mengikuti proses ini untuk mendeteksi yang terbaik acodec:

$ ffmpeg -formats | grep PCM 

 DE f32be           PCM 32-bit floating-point big-endian
 DE f32le           PCM 32-bit floating-point little-endian
 DE f64be           PCM 64-bit floating-point big-endian
 DE f64le           PCM 64-bit floating-point little-endian
 DE s16be           PCM signed 16-bit big-endian
 DE s16le           PCM signed 16-bit little-endian
 DE s24be           PCM signed 24-bit big-endian
 DE s24le           PCM signed 24-bit little-endian
 DE s32be           PCM signed 32-bit big-endian
 DE s32le           PCM signed 32-bit little-endian
 DE u16be           PCM unsigned 16-bit big-endian
 DE u16le           PCM unsigned 16-bit little-endian
 DE u24be           PCM unsigned 24-bit big-endian
 DE u24le           PCM unsigned 24-bit little-endian
 DE u32be           PCM unsigned 32-bit big-endian
 DE u32le           PCM unsigned 32-bit little-endian

Pada titik ini, pertimbangkan platform Anda untuk memilih big-endian,, little-endianbitrate pilih:

$ ffmpeg -i sample.mp3 
[mp3 @ 0x7fb33180da00] Estimating duration from bitrate, this may be inaccurate
Input #0, mp3, from 'sample.mp3':
  Metadata:
    title           : Saturday
    artist          : Winterwood
    album           : Love In The Heart
    track           : 2/15
    TPA             : 1/1
    encoded_by      : iTunes 11.0.1
    genre           : Country & Folk
    date            : 1997
  Duration: 00:04:27.76, start: 0.000000, bitrate: 128 kb/s
    Stream #0:0: Audio: mp3, 44100 Hz, stereo, s16p, 128 kb/s

Kita dapat melihat bahwa file audio ini adalah mp3(ini tidak jelas, meskipun ekstensi dari file input, cukup periksa byte) memiliki bitrate 128 kb/s, codec s16p, sampling di 44100 Hz, jadi kami memilih sesuai:

$ ffmpeg -i sample.mp3 -acodec pcm_s16le -ar 44100 sample.wav


Input #0, mp3, from 'sample.mp3':
  Metadata:
    title           : Saturday
    artist          : Winterwood
    album           : Love In The Heart
    track           : 2/15
    TPA             : 1/1
    encoded_by      : iTunes 11.0.1
    genre           : Country & Folk
    date            : 1997
  Duration: 00:04:27.76, start: 0.000000, bitrate: 128 kb/s
    Stream #0:0: Audio: mp3, 44100 Hz, stereo, s16p, 128 kb/s
File 'sample.wav' already exists. Overwrite ? [y/N] y
Output #0, wav, to 'sample.wav':
  Metadata:
    INAM            : Saturday
    IART            : Winterwood
    IPRD            : Love In The Heart
    IPRT            : 2/15
    TPA             : 1/1
    ITCH            : iTunes 11.0.1
    IGNR            : Country & Folk
    ICRD            : 1997
    ISFT            : Lavf56.4.101
    Stream #0:0: Audio: pcm_s16le ([1][0][0][0] / 0x0001), 44100 Hz, stereo, s16, 1411 kb/s
    Metadata:
      encoder         : Lavc56.1.100 pcm_s16le
Stream mapping:
  Stream #0:0 -> #0:0 (mp3 (native) -> pcm_s16le (native))
Press [q] to stop, [?] for help
size=   46125kB time=00:04:27.75 bitrate=1411.2kbits/s    
video:0kB audio:46125kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.000457%

Jika Anda menggunakan mac Anda dapat memeriksa audio jika tidak ada white noisedi awal / akhir (ketika audio asli mp3 tidak memiliki audio untuk beberapa msec / detik):

$ afplay sample.wav

dan tentu saja Anda dapat mengecek bitmap:

$ ffmpeg -i sample.wav
Input #0, wav, from 'sample.wav':
  Metadata:
    artist          : Winterwood
    date            : 1997
    genre           : Country & Folk
    title           : Saturday
    album           : Love In The Heart
    track           : 2/15
    encoder         : Lavf56.4.101
    encoded_by      : iTunes 11.0.1
  Duration: 00:04:27.76, bitrate: 1411 kb/s
    Stream #0:0: Audio: pcm_s16le ([1][0][0][0] / 0x0001), 44100 Hz, 2 channels, s16, 1411 kb/s
loretoparisi
sumber
0

Gunakan ffmpeg untuk mengkonversi media, periksa terlebih dahulu spesifikasi file menggunakan ffprobe. gunakan perintah ini ffmpeg -i kimberly.wav -acodec pcm_s16le -ar 16000 -ac 1 song.wav

dimana -pcm_s16le is codec 16 bit conversion -ar is sampling rate (16000samples/sec) -ac no of audio channel

Mayur Lokare
sumber