| 695 | } |
| 696 | |
| 697 | export const getDecentAudioBitrate = (codec: AVCodecID) => { |
| 698 | const baseRates = { |
| 699 | [AV_CODEC_ID_AAC]: 128000, // 128kbps base for AAC |
| 700 | [AV_CODEC_ID_OPUS]: 64000, // 64kbps base for Opus |
| 701 | [AV_CODEC_ID_MP3]: 160000, // 160kbps base for MP3 |
| 702 | [AV_CODEC_ID_VORBIS]: 64000, // 64kbps base for Vorbis |
| 703 | }; |
| 704 | |
| 705 | const baseBitrate = baseRates[codec as keyof typeof baseRates]; |
| 706 | if (!baseBitrate) { |
| 707 | return 0; // PCM case or FLAC or whatever |
| 708 | } |
| 709 | |
| 710 | const factor = 1; |
| 711 | let finalBitrate = baseBitrate * factor; |
| 712 | |
| 713 | if (codec === AV_CODEC_ID_AAC) { |
| 714 | // AAC only works with specific bitrates, let's find the closest |
| 715 | const validRates = [96000, 128000, 160000, 192000]; |
| 716 | finalBitrate = validRates.reduce((prev, curr) => |
| 717 | Math.abs(curr - finalBitrate) < Math.abs(prev - finalBitrate) ? curr : prev, |
| 718 | ); |
| 719 | } else if (codec === AV_CODEC_ID_OPUS || codec === AV_CODEC_ID_VORBIS) { |
| 720 | finalBitrate = Math.max(6000, finalBitrate); |
| 721 | } else if (codec === AV_CODEC_ID_MP3) { |
| 722 | const validRates = [ |
| 723 | 8000, 16000, 24000, 32000, 40000, 48000, 64000, 80000, |
| 724 | 96000, 112000, 128000, 160000, 192000, 224000, 256000, 320000, |
| 725 | ]; |
| 726 | finalBitrate = validRates.reduce((prev, curr) => |
| 727 | Math.abs(curr - finalBitrate) < Math.abs(prev - finalBitrate) ? curr : prev, |
| 728 | ); |
| 729 | } |
| 730 | |
| 731 | return Math.round(finalBitrate / 1000) * 1000; |
| 732 | }; |