Konwertuj mp3 na wav za pomocą FFmpeg dla VBR

27

Jakiego polecenia powinienem użyć do konwersji mp3pliku, wavktórego bitrate jest zmienny. Albo lepiej, skąd mam wiedzieć, czy to źródło audio ma fixedbitrate czy variable?

Soham Dasgupta
źródło
3
Nie sądzę, aby format pliku WAV obsługiwał zmienną przepływność. Ponieważ wszystkie dekodery MP3 muszą go obsługiwać, aby były zgodne ze standardami, powinieneś być w stanie przekonwertować dowolny plik MP3 na WAV o stałej szybkości transmisji bitów, chociaż wyniki będą się różnić w zależności od jakości źródłowego pliku MP3 i stałej szybkości transmisji bitów wybranej dla WAV stworzony. Większość oprogramowania do odtwarzania plików MP3 umożliwia przeglądanie właściwości odtwarzanego pliku, więc możesz użyć jednego z nich, aby sprawdzić, z jakim rodzajem plików źródłowych masz do czynienia.
martineau
A co z poleceniem? Co polecasz?
Soham Dasgupta
Przeczytaj ponownie odpowiedź Martineau. Poprawiłem kilka błędów. W szczególności nie można ustawić szybkości transmisji bitów dla plików WAV zakodowanych w PCM.
slhck

Odpowiedzi:

36

Możesz uzyskać informacje o przepływności plików wejściowych za pomocą ffprobe song.mp3polecenia. Jednak mówi to tylko o przepływności pierwszej klatki. VBR w plikach MP3 jest zwykle implementowany po prostu przez zmianę szybkości transmisji dla każdej klatki, więc tego, czy jest on używany, nie można ustalić, po prostu czytając nagłówek pierwszej klatki. Zwykle używam innego oprogramowania do odtwarzania plików audio, aby ustalić, czy używany jest VBR, ponieważ wielu to wyświetli (na przykład Foobar2000).

Gdy używasz stratnych kodeków wyjściowych (takich jak MPEG-1 Layer III lub AAC), ffmpeg wybiera domyślną szybkość transmisji dla strumienia wyjściowego lub zmienną szybkość transmisji. To zależy od samego enkodera.

W przypadku bezstratnych kodeków nie można ustawić zmiennej przepływności, ponieważ każda próbka przyjmuje określoną liczbę bitów. ffmpeg -i song.mp3 song.wavdostaniesz zatem plik WAV zakodowany w PCM o częstotliwości próbkowania 44,100 Hz i 16 bitach na próbkę. Powoduje to około 1411 kBit / s dla całego kontenera, prawdopodobnie znacznie, znacznie większy niż plik wejściowy MP3.

Jeśli chcesz mieć mniejszy rozmiar pliku WAV zakodowanego w PCM, ustaw format próbny o mniejszej głębi bitowej (zobacz -encodersopcję, aby uzyskać pełną listę tych plików ) i / lub wybierz niższą częstotliwość próbkowania ( -ar 22050na przykład użyłby 22,05 kHz).

Oto przykład zrobienia obu:

ffmpeg -i song.mp3 -acodec pcm_u8 -ar 22050 song.wav
martineau
źródło
5
Jeśli kodujesz dźwięk PCM w kontenerze WAV, nie możesz ustawić szybkości transmisji. To nie ma sensu. PCM jest formatem nieskompresowanym - nie można powiedzieć, aby używał więcej lub mniej bitów na sekundę. Jedynym sposobem dostosowania rozmiaru jest użycie innej wielkości próbki (patrz -sample_fmtsopcja). -ar 128koznacza, że ​​częstotliwość próbkowania wyniesie 128 000 Hz, zamiast zwykłych 44,1 lub 48 kHz.
slhck
12
Prawdopodobnie lepiej ffmpeg -i song.mp3 song.wavbędzie, jeśli wybierzesz odpowiednią szybkość transmisji (prawdopodobnie 44,1 kHz). Jeśli
przechodzisz
@ naught101 miał rację, w rzeczywistości lepiej pozwolić ffpmegwybrać właściwy bitrate próbkowania zgodnie z song.mp3danymi wejściowymi. W ten sposób wyjściowy wavplik bitmapy będzie miał najlepszą przepływność. Oznacza to, że rozmiar pliku będzie świetny, ale przy przeładowaniu danych: `Strumień # 0: 0: Audio: mp3, 44100 Hz, stereo, s16p, 128 kb / s`
loretoparisi
1
Można założyć, że pytający ma wypalić powstałe pliki WAV na płycie CD audio. Jedyną odpowiednią częstotliwością do tego jest 44100 Hz, więc -ar 44100jest to konieczne, nawet jeśli ffmpeg automatycznie użyje odpowiedniego 16-bitowego kodeka.
Michaił T.
3

Według komentarza @ naught101 śledzę ten proces, aby wykryć najlepsze 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

W tym momencie, należy rozważyć swoją platformę do wyboru big-endian, little-endianThe wybrać bitrate:

$ 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

Widzimy, że ten plik audio jest mp3(nie jest to oczywiste, pomimo rozszerzenia pliku wejściowego, po prostu sprawdź bajty) ma bitrate 128 kb/s, kodek był s16p, próbkowanie na 44100 Hz, więc wybieramy odpowiednio:

$ 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%

Jeśli korzystasz z systemu Mac, możesz sprawdzić dźwięk, jeśli nie ma go white noisena początku / końcu (gdy oryginalne audio MP3 nie ma dźwięku przez kilka ms / s):

$ afplay sample.wav

i oczywiście możesz dwukrotnie sprawdzić mapę bitową:

$ 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
źródło
0

Użyj ffmpeg do konwersji mediów, najpierw sprawdź specyfikację pliku za pomocą ffprobe. użyj tego polecenia ffmpeg -i kimberly.wav -acodec pcm_s16le -ar 16000 -ac 1 song.wav

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

Mayur Lokare
źródło