Ý tưởng

Nén file MP3 từ 128 kbps (kilobit per second) xuống dưới 16 kbps, giúp thời lượng lưu trữ nhiều hơn gấp 8.

Chất lượng âm thanh sẽ giảm, nhưng khi phát qua loa của máy nghe pháp sẽ ít cảm thấy sự khác biệt.

Phương pháp nén

Giảm sample rate

Sample rate: Số lần trên giây mà một tín hiệu âm thanh được lấy mẫu để chuyển thành tín hiệu số.

Số lượng mẫu trên 1 giây càng thấp thì file nén ra càng nhỏ.

Âm thanh gốc (trích đoạn 30 giây)

audio_cut_30s.opus.spectrogram.png

Duration: 00:00:30.01, start: 0.007500, bitrate: 103 kb/s
Stream #0:0(eng): Audio: opus, 48000 Hz, stereo, fltp

Giảm sample rate xuống 8000 Hz

ffmpeg -hide_banner -y -i "$input" -c:a libmp3lame \
  -ar 8000 \
  "$output"

output.s8000.mp3.spectrogram.png

Dùng mã hóa VBR

MP3 có ba phương pháp mã hóa:

  • CBR (Constant Bit Rate): Mỗi giây của file âm thanh được nén với cùng một bitrate, nhưng không tối ưu dung lượng.
  • VBR (Variable Bit Rate): Cho phép bitrate thay đổi tùy theo độ phức tạp của âm thanh. Đoạn phức tạp có bitrate cao hơn, đoạn đơn giản có bitrate thấp hơn, giúp tối ưu dung lượng mà vẫn giữ được chất lượng tốt nhất có thể.
  • ABR (Average Bit Rate - Bitrate trung bình): Kết hợp giữa CBR và VBR, giúp cân bằng giữa chất lượng và dung lượng.

Trong ba phương pháp, VBR tối ưu nhất về dung lượng nhưng có khả năng tương thích thấp với một số máy nghe MP3. Do đó, tùy theo thiết bị, nên thử với VBR trước, rồi đến ABR và CBR.

Thêm VBR

ffmpeg -hide_banner -y -i "$input" -c:a libmp3lame \
  -ar 8000 \
  -q:a 9 \
  "$output"

output.s8000.vbr9.mp3.spectrogram.png

Thu hẹp phạm vi tần số

Frequency: Số lần dao động của sóng âm trong một giây, được đo bằng Hertz (Hz). Tai người có thể nghe âm thanh trong khoảng 20 Hz - 20 kHz.

Khi giảm sample rate xuống 8000 Hz, phạm vi tần số đầu ra đã giảm từ 0 - 14 kHz xuống còn 0 - 4 kHz. Bước này tiếp tục thu hẹp phạm vi tần số xuống Narrowband (300–3,400 Hz).

Narrowband chủ yếu được sử dụng trong hệ thống điện thoại truyền thống, giúp tối ưu băng thông để truyền giọng nói hiệu quả mà không tiêu tốn quá nhiều tài nguyên mạng.

Thêm narrowband

ffmpeg -hide_banner -y -i "$input" -c:a libmp3lame \
  -ar 8000 \
  -q:a 9 \
  -af "highpass=300,lowpass=3400" \
  "$output"

output.s8000.vbr9.narrowband.mp3.spectrogram.png

Down-mix từ stereo sang mono

Hai kênh trái (L) và phải (R) được kết hợp lại thành một kênh duy nhất.

Thêm down-mix

ffmpeg -hide_banner -y -i "$input" -c:a libmp3lame \
  -ar 8000 \
  -q:a 9 \
  -af "highpass=300,lowpass=3400" \
  -ac 1 \
  "$output"

output.s8000.vbr9.narrowband.downmix.mp3.spectrogram.png

Tổng kết

Kết quả nén đoạn trích 30 giây

ffmpeg -hide_banner -y -i "$input" -c:a libmp3lame \
  -ar 8000 \
  -q:a 9 \
  -af "highpass=300,lowpass=3400" \
  -ac 1 \
  "$output"
Phương pháp Bitrate (kbps) Giảm thêm
Gốc 101.4 -
Sample rate 23.6 77%
VBR 15.2 36%
Narrowband 14.7 3%
Downmix 14.1 5%


Kết quả nén một bài giảng

Phương pháp Bitrate (kbps) File size (MB) Giảm thêm
Gốc 101.4 84.3 -
Sample rate 23.4 19.5 77%
VBR 15.3 12.7 35%
Narrowband 14.7 12.2 4%
Downmix 14.0 11.6 5%

final.output.mp3.spectrogram.png

Tham khảo