fix: WebM/Opus audio duration shows zero - add durationchange listener and preload=auto
This commit is contained in:
@@ -383,7 +383,7 @@ export const VoiceAvatarPlaceholder: React.FC<{ domainName?: string; onVoiceSet?
|
|||||||
}
|
}
|
||||||
setAudioFile(file);
|
setAudioFile(file);
|
||||||
const url = URL.createObjectURL(blob);
|
const url = URL.createObjectURL(blob);
|
||||||
console.log('[VoiceClone] Created audio preview URL:', url, 'size:', file.size, 'type:', blob.type);
|
if (process.env.NODE_ENV === 'development') console.log('[VoiceClone] Created audio preview URL:', url.split('?')[0], 'size:', file.size, 'type:', blob.type);
|
||||||
setAudioPreviewUrl(url);
|
setAudioPreviewUrl(url);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
console.error('[VoiceClone] Error creating audio blob:', err);
|
console.error('[VoiceClone] Error creating audio blob:', err);
|
||||||
@@ -813,7 +813,8 @@ export const VoiceAvatarPlaceholder: React.FC<{ domainName?: string; onVoiceSet?
|
|||||||
<audio
|
<audio
|
||||||
key={audioPreviewUrl}
|
key={audioPreviewUrl}
|
||||||
controls
|
controls
|
||||||
src={audioPreviewUrl}
|
src={audioPreviewUrl}
|
||||||
|
preload="auto"
|
||||||
style={{ height: '30px', width: '100%' }}
|
style={{ height: '30px', width: '100%' }}
|
||||||
onError={(e) => {
|
onError={(e) => {
|
||||||
console.error('[VoiceClone] Audio playback error:', e);
|
console.error('[VoiceClone] Audio playback error:', e);
|
||||||
@@ -1075,7 +1076,8 @@ export const VoiceAvatarPlaceholder: React.FC<{ domainName?: string; onVoiceSet?
|
|||||||
<audio
|
<audio
|
||||||
key={audioPreviewUrl}
|
key={audioPreviewUrl}
|
||||||
controls
|
controls
|
||||||
src={audioPreviewUrl}
|
src={audioPreviewUrl}
|
||||||
|
preload="auto"
|
||||||
style={{ width: '100%', height: '28px' }}
|
style={{ width: '100%', height: '28px' }}
|
||||||
onError={(e) => {
|
onError={(e) => {
|
||||||
console.error('[VoiceClone] Source audio playback error:', e);
|
console.error('[VoiceClone] Source audio playback error:', e);
|
||||||
|
|||||||
@@ -105,7 +105,12 @@ export const InlineAudioPlayer: React.FC<InlineAudioPlayerProps> = ({ audioUrl,
|
|||||||
if (!audio || !blobUrl) return;
|
if (!audio || !blobUrl) return;
|
||||||
|
|
||||||
const updateTime = () => setCurrentTime(audio.currentTime);
|
const updateTime = () => setCurrentTime(audio.currentTime);
|
||||||
const updateDuration = () => setDuration(audio.duration);
|
const updateDuration = () => {
|
||||||
|
const d = audio.duration;
|
||||||
|
if (d && isFinite(d) && d > 0) {
|
||||||
|
setDuration(d);
|
||||||
|
}
|
||||||
|
};
|
||||||
const handleEnd = () => setPlaying(false);
|
const handleEnd = () => setPlaying(false);
|
||||||
const handleError = () => {
|
const handleError = () => {
|
||||||
setError('Audio playback error. Please try again.');
|
setError('Audio playback error. Please try again.');
|
||||||
@@ -114,12 +119,14 @@ export const InlineAudioPlayer: React.FC<InlineAudioPlayerProps> = ({ audioUrl,
|
|||||||
|
|
||||||
audio.addEventListener("timeupdate", updateTime);
|
audio.addEventListener("timeupdate", updateTime);
|
||||||
audio.addEventListener("loadedmetadata", updateDuration);
|
audio.addEventListener("loadedmetadata", updateDuration);
|
||||||
|
audio.addEventListener("durationchange", updateDuration);
|
||||||
audio.addEventListener("ended", handleEnd);
|
audio.addEventListener("ended", handleEnd);
|
||||||
audio.addEventListener("error", handleError);
|
audio.addEventListener("error", handleError);
|
||||||
|
|
||||||
return () => {
|
return () => {
|
||||||
audio.removeEventListener("timeupdate", updateTime);
|
audio.removeEventListener("timeupdate", updateTime);
|
||||||
audio.removeEventListener("loadedmetadata", updateDuration);
|
audio.removeEventListener("loadedmetadata", updateDuration);
|
||||||
|
audio.removeEventListener("durationchange", updateDuration);
|
||||||
audio.removeEventListener("ended", handleEnd);
|
audio.removeEventListener("ended", handleEnd);
|
||||||
audio.removeEventListener("error", handleError);
|
audio.removeEventListener("error", handleError);
|
||||||
};
|
};
|
||||||
@@ -239,7 +246,7 @@ export const InlineAudioPlayer: React.FC<InlineAudioPlayerProps> = ({ audioUrl,
|
|||||||
</Tooltip>
|
</Tooltip>
|
||||||
</Stack>
|
</Stack>
|
||||||
{effectiveAudioUrl && (
|
{effectiveAudioUrl && (
|
||||||
<audio ref={audioRef} src={effectiveAudioUrl} preload="metadata" />
|
<audio ref={audioRef} src={effectiveAudioUrl} preload="auto" />
|
||||||
)}
|
)}
|
||||||
</Stack>
|
</Stack>
|
||||||
</Paper>
|
</Paper>
|
||||||
|
|||||||
Reference in New Issue
Block a user