|
import React, { useMemo, useEffect } from 'react'; |
|
import { audioBufferToWav, blobFromAudioBuffer } from '../utils/utils'; |
|
import { encode } from 'base64-arraybuffer'; |
|
|
|
interface AudioPlayerProps { |
|
audioBuffer: AudioBuffer; |
|
} |
|
|
|
export const AudioPlayer: React.FC<AudioPlayerProps> = ({ audioBuffer }) => { |
|
|
|
const blobUrl = useMemo(() => { |
|
const wavBlob = blobFromAudioBuffer(audioBuffer); |
|
return URL.createObjectURL(wavBlob); |
|
}, [audioBuffer]); |
|
|
|
const downloadUrl = useMemo(() => { |
|
const wavArrayBuffer = audioBufferToWav(audioBuffer, { float32: false }); |
|
const base64 = encode(wavArrayBuffer); |
|
return `data:audio/wav;base64,${base64}`; |
|
}, [audioBuffer]); |
|
|
|
|
|
useEffect(() => { |
|
return () => { |
|
URL.revokeObjectURL(blobUrl); |
|
}; |
|
}, [blobUrl]); |
|
|
|
return ( |
|
<div className="mt-4 flex items-center"> |
|
<audio controls src={blobUrl}> |
|
Your browser does not support the audio element. |
|
</audio> |
|
|
|
<a |
|
className="btn btn-sm btn-primary ml-2" |
|
href={downloadUrl} |
|
download={'podcast.wav'} |
|
> |
|
Download |
|
</a> |
|
</div> |
|
); |
|
}; |
|
|