🎧 aura convert · professional online audio converter

aura convert client‑side

MP3 · WAV · M4A · AAC · OGG · FLAC · WMA → MP3 · WAV · AAC · OGG · FLAC

Drag & drop audio files

or
Supported: MP3, WAV, M4A, AAC, OGG, FLAC, WMA (up to 200MB each)

File queue

No files added yet

Conversion settings

Output format
Bitrate
Channels
Sample rate
Trim (seconds)
(leave end empty for full)
Audio preview
Select a file from queue to preview

What is an Audio Converter?

A browser‑based tool that changes audio file formats without uploading to any server. All conversions happen locally using FFmpeg WebAssembly.

🎵 Supported input

  • MP3, WAV, M4A, AAC
  • OGG, FLAC, WMA

⚙️ Output formats

  • MP3, WAV, AAC, OGG, FLAC
  • Adjustable bitrate, channels

📋 How to use

  • 1. Drag files or click browse
  • 2. Choose output settings
  • 3. Click "Convert all"
  • 4. Download converted files
⏳ initializing FFmpeg (first load ~20MB) ...
`; return; } let html = ''; files.forEach(f => { const statusText = f.status === 'done' ? 'done' : (f.status === 'processing' ? 'processing' : 'pending'); const statusClass = f.status === 'done' ? 'done' : ''; const sizeStr = (f.size / 1024).toFixed(1) + ' KB'; html += `
${f.name} ${sizeStr} ${statusText}
${f.status === 'done' ? `` : ''}
`; }); fileListContainer.innerHTML = html; // attach event listeners inside queue document.querySelectorAll('.preview-btn').forEach(btn => { btn.addEventListener('click', (e) => { const id = parseInt(btn.dataset.id); const fileItem = files.find(f => f.id === id); if (fileItem) { const url = URL.createObjectURL(fileItem.file); audioPreview.src = url; audioPreview.load(); audioPreview.play().catch(() => {}); noPreviewMsg.style.display = 'none'; } }); }); document.querySelectorAll('.remove-btn').forEach(btn => { btn.addEventListener('click', (e) => { const id = parseInt(btn.dataset.id); removeFileById(id); }); }); document.querySelectorAll('.download-btn').forEach(btn => { btn.addEventListener('click', (e) => { const id = parseInt(btn.dataset.id); const fileItem = files.find(f => f.id === id); if (fileItem && fileItem.outputBlob) { const a = document.createElement('a'); a.href = fileItem.outputUrl; a.download = `converted_${fileItem.name.split('.').slice(0,-1).join('.')}.${outputFormat.value}`; a.click(); } }); }); } function removeFileById(id) { const index = files.findIndex(f => f.id === id); if (index !== -1) { if (files[index].outputUrl) URL.revokeObjectURL(files[index].outputUrl); files.splice(index, 1); renderQueue(); } } // ----- add files ----- function addFiles(selectedFiles) { for (let file of selectedFiles) { if (file.size > 200 * 1024 * 1024) { alert(`File ${file.name} exceeds 200MB – may cause memory issues.`); continue; } const id = nextId++; files.push({ id, file, name: file.name, size: file.size, status: 'pending', outputBlob: null, outputUrl: null, outputSize: null }); } renderQueue(); } // ----- event listeners upload ----- browseBtn.addEventListener('click', () => fileInput.click()); fileInput.addEventListener('change', (e) => { if (e.target.files.length) addFiles(Array.from(e.target.files)); fileInput.value = ''; }); // drag & drop ['dragenter', 'dragover', 'dragleave', 'drop'].forEach(e => dropZone.addEventListener(e, (ev) => ev.preventDefault())); dropZone.addEventListener('dragover', () => dropZone.classList.add('dragover')); dropZone.addEventListener('dragleave', () => dropZone.classList.remove('dragover')); dropZone.addEventListener('drop', (e) => { dropZone.classList.remove('dragover'); if (e.dataTransfer.files.length) addFiles(Array.from(e.dataTransfer.files)); }); dropZone.addEventListener('click', (e) => { if (e.target === browseBtn || e.target.closest('.upload-btn')) return; fileInput.click(); }); // clear buttons clearAllBtn.addEventListener('click', () => { files.forEach(f => { if (f.outputUrl) URL.revokeObjectURL(f.outputUrl); }); files = []; renderQueue(); }); clearCompletedBtn.addEventListener('click', () => { files = files.filter(f => f.status !== 'done'); renderQueue(); }); // ----- conversion logic ----- async function convertFile(fileItem) { if (!ffmpegLoaded) throw new Error('FFmpeg not ready'); currentFileId = fileItem.id; fileItem.status = 'processing'; renderQueue(); const inputFileName = fileItem.name; const outExt = outputFormat.value; const outputFileName = `converted_${Date.now()}.${outExt}`; // prepare args let args = []; const start = parseFloat(trimStart.value) || 0; const end = trimEnd.value ? parseFloat(trimEnd.value) : null; if (end !== null && end > start) { args.push('-ss', start.toString(), '-i', inputFileName, '-to', (end - start).toString()); } else if (start > 0) { args.push('-ss', start.toString(), '-i', inputFileName); } else { args.push('-i', inputFileName); } // codec if (outExt === 'mp3') args.push('-codec:a', 'libmp3lame'); else if (outExt === 'aac') args.push('-codec:a', 'aac'); else if (outExt === 'ogg') args.push('-codec:a', 'libvorbis'); else if (outExt === 'flac') args.push('-codec:a', 'flac'); else if (outExt === 'wav') args.push('-codec:a', 'pcm_s16le'); // bitrate (not for wav) if (outExt !== 'wav') args.push('-b:a', bitrateSelect.value); // channels args.push('-ac', channelsSelect.value); // sample rate args.push('-ar', sampleRateSelect.value); args.push('-y', outputFileName); // read file const fileData = await fetchFile(fileItem.file); ffmpeg.FS('writeFile', inputFileName, fileData); // run progressArea.classList.remove('hidden'); currentFileLabel.innerText = fileItem.name; progressFill.style.width = '0%'; progressPercent.innerText = '0%'; progressStatus.innerText = 'starting'; cancelBtn.disabled = false; try { await ffmpeg.run(...args); if (cancelCurrent) { cancelCurrent = false; return; // discard } const outputData = ffmpeg.FS('readFile', outputFileName); const blob = new Blob([outputData.buffer], { type: 'audio/' + outExt }); const url = URL.createObjectURL(blob); fileItem.outputBlob = blob; fileItem.outputUrl = url; fileItem.outputSize = blob.size; fileItem.status = 'done'; // update download area (latest file) globalDownloadLink.href = url; globalDownloadLink.download = `converted_${fileItem.name}.${outExt}`; downloadArea.classList.remove('hidden'); // cleanup fs ffmpeg.FS('unlink', inputFileName); ffmpeg.FS('unlink', outputFileName); } catch (err) { fileItem.status = 'pending'; alert(`Conversion failed for ${fileItem.name}: ${err.message}`); } finally { if (fileItem.id === currentFileId) currentFileId = null; renderQueue(); if (!files.some(f => f.status === 'processing')) { progressArea.classList.add('hidden'); cancelBtn.disabled = true; isConverting = false; } } } // process queue sequentially async function processQueue() { if (isConverting || !ffmpegLoaded) return; isConverting = true; cancelCurrent = false; cancelBtn.disabled = false; for (let f of files) { if (cancelCurrent) break; if (f.status === 'pending') { await convertFile(f); } } isConverting = false; cancelBtn.disabled = true; progressArea.classList.add('hidden'); cancelCurrent = false; } convertAllBtn.addEventListener('click', processQueue); cancelBtn.addEventListener('click', () => { cancelCurrent = true; cancelBtn.disabled = true; progressStatus.innerText = 'cancelling...'; // ffmpeg will finish current step but we discard result }); // disable bitrate for wav outputFormat.addEventListener('change', () => { bitrateSelect.disabled = outputFormat.value === 'wav'; }); })();
zaheerpashamd

Share
Published by
zaheerpashamd

Recent Posts

Protect PDF

Protect PDF - Add Password | Secure & Free Protect PDF Add password protection to…

9 months ago

PNG to PDF Converter

PNG to PDF Converter PNG to PDF Converter Upload your PNG images and convert them…

9 months ago

PDF to PNG Converter

PDF to PNG Converter PDF to PNG Converter Upload your PDF file and convert it…

9 months ago

Advanced Image Resize Tool

Advanced Image Resize Tool - Free Online Image Resizer Home > Tools > Image Resize…

10 months ago

Geometry Calculator

Geometry Calculator Geometry Calculator Calculate area, perimeter, volume, and other properties of geometric shapes Select…

11 months ago

Algebra Calculator

Algebra Calculator Algebra Calculator Solve equations, simplify expressions, and perform algebraic operations Enter Expression or…

11 months ago