story-generator/src/utils/audioConverter.ts
Lucas Santana 3e7bf811fe fix: simplifica reprodução de áudio e corrige CORS
- Remove lógica redundante de URL pública
- Usa diretamente audio_url do banco
- Mantém configuração original do Supabase client
- Melhora tratamento de erros na reprodução
2024-12-30 10:20:29 -03:00

42 lines
1.4 KiB
TypeScript

import { FFmpeg } from '@ffmpeg/ffmpeg';
import { toBlobURL } from '@ffmpeg/util';
let ffmpeg: FFmpeg | null = null;
export async function convertWebmToMp3(webmUrl: string): Promise<{ url: string; blob: Blob }> {
if (!ffmpeg) {
ffmpeg = new FFmpeg();
const baseURL = 'https://unpkg.com/@ffmpeg/core@0.12.4/dist/umd';
await ffmpeg.load({
coreURL: await toBlobURL(`${baseURL}/ffmpeg-core.js`, 'text/javascript'),
wasmURL: await toBlobURL(`${baseURL}/ffmpeg-core.wasm`, 'application/wasm'),
});
}
try {
// Baixar o arquivo WebM
const webmResponse = await fetch(webmUrl);
const webmBlob = await webmResponse.blob();
const webmBuffer = await webmBlob.arrayBuffer();
// Escrever o arquivo de entrada no sistema de arquivos virtual do FFmpeg
await ffmpeg.writeFile('input.webm', new Uint8Array(webmBuffer));
// Executar a conversão
await ffmpeg.exec(['-i', 'input.webm', '-acodec', 'libmp3lame', '-ab', '128k', 'output.mp3']);
// Ler o arquivo convertido
const mp3Data = await ffmpeg.readFile('output.mp3');
const mp3Blob = new Blob([mp3Data], { type: 'audio/mp3' });
const mp3Url = URL.createObjectURL(mp3Blob);
// Limpar arquivos do sistema de arquivos virtual
await ffmpeg.deleteFile('input.webm');
await ffmpeg.deleteFile('output.mp3');
return { url: mp3Url, blob: mp3Blob };
} catch (error) {
console.error('Erro na conversão do áudio:', error);
throw error;
}
}