Skip to content

Audio Conversion

Audiox provides powerful audio conversion capabilities powered by FFmpeg, allowing you to transform audio files between formats while maintaining quality and control over the output.

Basic Conversion

Convert audio files using the simple audio() function:

ts
import { audio } from '@stacksjs/audiox'

// Basic MP3 to WAV conversion
await audio('input.mp3', 'output.wav')

// With custom options
await audio('input.mp3', 'output.wav', {
  codec: 'pcm_s16le',
  channels: 1,
  sampleRate: 16000,
  bitrate: '160k',
})

CLI Conversion

Use the command line for quick conversions:

bash
# Basic conversion
audiox convert input.mp3 output.wav

# With options
audiox convert input.mp3 output.wav \
  --codec pcm_s16le \
  --channels 1 \
  --sample-rate 16000

# High-quality MP3 conversion
audiox convert podcast.wav podcast.mp3 \
  --codec mp3 \
  --bitrate 320k \
  --sample-rate 48000

# Quality settings
audiox convert input.mp3 output.mp3 --bitrate 320k

# Channel and sample rate
audiox convert input.mp3 output.wav --channels 1 --sample-rate 16000

# Batch conversion
audiox convert *.mp3 --output-format wav

Conversion Options

Codec Selection

Choose the appropriate codec for your output format:

ts
// MP3 encoding
await audio('input.wav', 'output.mp3', {
  codec: 'mp3',
  bitrate: '192k',
})

// AAC encoding (great for streaming)
await audio('input.wav', 'output.aac', {
  codec: 'aac',
  bitrate: '128k',
})

// Lossless WAV
await audio('input.mp3', 'output.wav', {
  codec: 'pcm_s16le',
})

Bitrate Control

Control the bitrate for lossy formats:

ts
// High quality (320kbps)
await audio('input.wav', 'output.mp3', {
  codec: 'mp3',
  bitrate: '320k',
})

// Medium quality (192kbps)
await audio('input.wav', 'output.mp3', {
  codec: 'mp3',
  bitrate: '192k',
})

// Low bandwidth (64kbps)
await audio('input.wav', 'output.mp3', {
  codec: 'mp3',
  bitrate: '64k',
})

Sample Rate Adjustment

Adjust the sample rate for different use cases:

ts
// CD quality (44.1kHz)
await audio('input.mp3', 'output.wav', {
  sampleRate: 44100,
})

// Professional audio (48kHz)
await audio('input.mp3', 'output.wav', {
  sampleRate: 48000,
})

// Voice/telephony (16kHz)
await audio('input.mp3', 'output.wav', {
  sampleRate: 16000,
})

// Low bandwidth (8kHz)
await audio('input.mp3', 'output.wav', {
  sampleRate: 8000,
})

Channel Configuration

Configure audio channels for mono or stereo output:

ts
// Convert to mono (for voice/speech)
await audio('input.mp3', 'output.wav', {
  channels: 1,
})

// Stereo output
await audio('input.mp3', 'output.wav', {
  channels: 2,
})

// Surround sound (if supported)
await audio('input.mp3', 'output.wav', {
  channels: 5.1,
})

Stream-Based Conversion

For processing large files or real-time audio:

ts
import { audioWithStreamInput, audioWithStreamOut } from '@stacksjs/audiox'

// Input from stream
const file = Bun.file('large-file.mp3')
const stream = file.stream()

await audioWithStreamInput(stream, 'output.wav', {
  codec: 'pcm_s16le',
  channels: 1,
  sampleRate: 16000,
})

// Output to stream with callbacks
await audioWithStreamOut(
  'input.mp3',
  {
    onProcessDataFlushed: (chunk) => {
      console.log(`Processing chunk: ${chunk?.length} bytes`)
    },
    onProcessDataEnd: async (data) => {
      await Bun.write('output.wav', data!)
    },
  },
  {
    codec: 'pcm_s16le',
    channels: 1,
    sampleRate: 16000,
  },
)

Buffer-Based Conversion

Convert audio directly from buffers:

ts
import { audioWav } from '@stacksjs/audiox'

// Read file as buffer
const arrayBuffer = await Bun.file('input.mp3').arrayBuffer()

// Convert to WAV
const wavData = await audioWav(new Uint8Array(arrayBuffer))

// Write output
await Bun.write('output.wav', wavData)

Quality Settings

Fine-tune quality for variable bitrate encoding:

ts
// Highest quality (0)
await audio('input.wav', 'output.mp3', {
  codec: 'mp3',
  quality: 0,
})

// Balanced quality (5)
await audio('input.wav', 'output.mp3', {
  codec: 'mp3',
  quality: 5,
})

// Smaller file size (9)
await audio('input.wav', 'output.mp3', {
  codec: 'mp3',
  quality: 9,
})

Error Handling

Handle conversion errors gracefully:

ts
import { audio } from '@stacksjs/audiox'

try {
  await audio('input.mp3', 'output.wav', {
    codec: 'pcm_s16le',
    onError: (error) => {
      console.error('Conversion error:', error)
    },
  })
}
catch (error) {
  console.error('Failed to convert audio:', error)
}

Best Practices

  1. Choose the Right Codec: Use MP3 for compatibility, AAC for streaming, and WAV for lossless quality
  2. Match Sample Rates: Avoid upsampling when possible to prevent artifacts
  3. Consider Mono for Speech: Voice recordings often work well in mono, reducing file size
  4. Use Streams for Large Files: Stream processing is more memory-efficient
  5. Set Appropriate Bitrates: Higher bitrates mean better quality but larger files
  6. Format Selection
    • Use WAV for lossless quality
    • Use MP3 for size efficiency
    • Use AAC for modern compatibility
  7. Quality Optimization
    • Match sample rate to content type
    • Choose appropriate bitrates
    • Consider target platform requirements
  8. Performance
    • Use batch processing for multiple files
    • Monitor system resources
    • Implement proper error handling

Released under the MIT License.