mirror of
https://github.com/R0m1k3/Regisflow.git
synced 2026-10-24 15:48:17 +02:00
Improve camera functionality and address issues with blank image display
Enhances CameraModal and useCamera hook with autoplay, error handling, and metadata checks to resolve blank image issues. Replit-Commit-Author: Agent Replit-Commit-Session-Id: dec54137-d5a2-4406-8ad4-5f2f9fb110bf Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/0715008c-7244-40f4-befc-26c014852236/957e99ed-c3d1-4917-a66f-70911fc0ed4b.jpg
This commit is contained in:
1 parent
c426abfc33
commit
ed38c25c9f
2 files changed
+54
-10
No files matched your search
@@ -70,12 +70,17 @@ export default function CameraModal({
|
|||||||
autoPlay
|
autoPlay
|
||||||
playsInline
|
playsInline
|
||||||
muted
|
muted
|
||||||
className="w-full max-w-full h-auto camera-preview rounded-lg border"
|
className="w-full max-w-full h-auto camera-preview rounded-lg border bg-black"
|
||||||
style={{
|
style={{
|
||||||
aspectRatio: '16/9',
|
aspectRatio: '16/9',
|
||||||
objectFit: 'cover',
|
objectFit: 'cover',
|
||||||
maxHeight: '400px'
|
maxHeight: '400px',
|
||||||
|
minHeight: '200px'
|
||||||
}}
|
}}
|
||||||
|
onLoadedMetadata={() => console.log('CameraModal: Video metadata loaded')}
|
||||||
|
onCanPlay={() => console.log('CameraModal: Video can play')}
|
||||||
|
onPlay={() => console.log('CameraModal: Video playing')}
|
||||||
|
onError={(e) => console.error('CameraModal: Video error:', e)}
|
||||||
/>
|
/>
|
||||||
<canvas ref={canvasRef} className="hidden" />
|
<canvas ref={canvasRef} className="hidden" />
|
||||||
|
|
||||||
|
|||||||
@@ -55,36 +55,75 @@ export function useCamera() {
|
|||||||
setIsOpen(true);
|
setIsOpen(true);
|
||||||
|
|
||||||
if (videoRef.current) {
|
if (videoRef.current) {
|
||||||
videoRef.current.srcObject = stream;
|
const video = videoRef.current;
|
||||||
|
video.srcObject = stream;
|
||||||
console.log('Video stream attached to video element');
|
console.log('Video stream attached to video element');
|
||||||
|
|
||||||
|
// Forcer le démarrage de la vidéo
|
||||||
|
video.autoplay = true;
|
||||||
|
video.playsInline = true;
|
||||||
|
video.muted = true;
|
||||||
|
|
||||||
|
// Forcer le play immédiatement
|
||||||
|
try {
|
||||||
|
await video.play();
|
||||||
|
console.log('Video play() successful');
|
||||||
|
} catch (playError) {
|
||||||
|
console.warn('Video play() failed:', playError);
|
||||||
|
}
|
||||||
|
|
||||||
// Attendre que la vidéo soit prête
|
// Attendre que la vidéo soit prête
|
||||||
return new Promise<boolean>((resolve, reject) => {
|
return new Promise<boolean>((resolve, reject) => {
|
||||||
const video = videoRef.current!;
|
|
||||||
|
|
||||||
const handleLoadedMetadata = () => {
|
const handleLoadedMetadata = () => {
|
||||||
console.log('Video metadata loaded, dimensions:', video.videoWidth, 'x', video.videoHeight);
|
console.log('Video metadata loaded successfully');
|
||||||
|
console.log('Video dimensions:', video.videoWidth, 'x', video.videoHeight);
|
||||||
|
console.log('Video readyState:', video.readyState);
|
||||||
|
console.log('Video paused:', video.paused);
|
||||||
|
console.log('Video ended:', video.ended);
|
||||||
video.removeEventListener('loadedmetadata', handleLoadedMetadata);
|
video.removeEventListener('loadedmetadata', handleLoadedMetadata);
|
||||||
video.removeEventListener('error', handleError);
|
video.removeEventListener('error', handleError);
|
||||||
|
video.removeEventListener('canplay', handleCanPlay);
|
||||||
resolve(true);
|
resolve(true);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const handleCanPlay = () => {
|
||||||
|
console.log('Video can play event fired');
|
||||||
|
if (video.videoWidth > 0 && video.videoHeight > 0) {
|
||||||
|
handleLoadedMetadata();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
const handleError = (error: Event) => {
|
const handleError = (error: Event) => {
|
||||||
console.error('Video error:', error);
|
console.error('Video error event:', error);
|
||||||
video.removeEventListener('loadedmetadata', handleLoadedMetadata);
|
video.removeEventListener('loadedmetadata', handleLoadedMetadata);
|
||||||
video.removeEventListener('error', handleError);
|
video.removeEventListener('error', handleError);
|
||||||
|
video.removeEventListener('canplay', handleCanPlay);
|
||||||
reject(new Error('Erreur lors du chargement de la vidéo'));
|
reject(new Error('Erreur lors du chargement de la vidéo'));
|
||||||
};
|
};
|
||||||
|
|
||||||
video.addEventListener('loadedmetadata', handleLoadedMetadata);
|
video.addEventListener('loadedmetadata', handleLoadedMetadata);
|
||||||
|
video.addEventListener('canplay', handleCanPlay);
|
||||||
video.addEventListener('error', handleError);
|
video.addEventListener('error', handleError);
|
||||||
|
|
||||||
// Timeout de sécurité
|
// Si les métadonnées sont déjà chargées
|
||||||
|
if (video.readyState >= 1 && video.videoWidth > 0) {
|
||||||
|
console.log('Video metadata already available');
|
||||||
|
handleLoadedMetadata();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Timeout de sécurité réduit
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
video.removeEventListener('loadedmetadata', handleLoadedMetadata);
|
video.removeEventListener('loadedmetadata', handleLoadedMetadata);
|
||||||
video.removeEventListener('error', handleError);
|
video.removeEventListener('error', handleError);
|
||||||
resolve(true); // Continuer même si metadata pas encore chargé
|
video.removeEventListener('canplay', handleCanPlay);
|
||||||
}, 5000);
|
console.log('Video load timeout, current state:', {
|
||||||
|
readyState: video.readyState,
|
||||||
|
videoWidth: video.videoWidth,
|
||||||
|
videoHeight: video.videoHeight,
|
||||||
|
paused: video.paused
|
||||||
|
});
|
||||||
|
resolve(true);
|
||||||
|
}, 3000);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in new issue
Block a user