import React, { useState, useEffect } from 'react'; import { View, Text, Video } from '@tarojs/components'; import { useRouter } from '@tarojs/taro'; import styles from './index.module.scss'; import { getCameras, playCamera } from '@/api/video'; import { resolveUrl } from '@/api/config'; import type { Camera } from '@/types'; const VideoPlayerPage: React.FC = () => { const router = useRouter(); const cameraId = router.params.id ? Number(router.params.id) : 0; const cameraName = router.params.name ? decodeURIComponent(router.params.name) : '视频播放'; const directUrl = router.params.url ? decodeURIComponent(router.params.url) : ''; const [camera, setCamera] = useState(null); const [videoUrl, setVideoUrl] = useState(directUrl); const [format, setFormat] = useState<'hls' | 'flv' | 'webrtc'>('hls'); const [loading, setLoading] = useState(false); const [error, setError] = useState(''); useEffect(() => { if (directUrl) { setVideoUrl(resolveUrl(directUrl)); return; } const fetchCamera = async () => { try { const cameras = await getCameras().catch(() => [] as Camera[]); const found = cameras.find((c) => c.id === cameraId); if (found) { setCamera(found); } } catch (err) { console.error('[VideoPlayer] 获取摄像头信息失败:', err); } }; fetchCamera(); }, [cameraId, directUrl]); const handlePlay = async () => { const id = cameraId || camera?.id; if (!id) return; setLoading(true); setError(''); try { const info = await playCamera(id, { format: 'flv' }); const streamUrl = resolveUrl(info.url); console.log('[VideoPlayer] 获取播放地址成功:', streamUrl); setVideoUrl(streamUrl); } catch (err) { setError(err instanceof Error ? err.message : '获取播放地址失败'); } finally { setLoading(false); } }; const formats: { key: 'hls' | 'flv' | 'webrtc'; label: string }[] = [ { key: 'hls', label: 'HLS' }, { key: 'flv', label: 'FLV' }, { key: 'webrtc', label: 'WebRTC' }, ]; const isLive = !directUrl; return ( {/* 视频播放区域 */} {videoUrl ? ( {/* 控制区域 */} {isLive && ( {camera?.name || cameraName} {formats.map((f) => ( setFormat(f.key)} > {f.label} ))} {loading ? '加载中...' : videoUrl ? '重新播放' : '开始播放'} )} {/* 摄像头信息 */} {camera && ( 设备信息 编码 {camera.code} 状态 {camera.isOnline ? '在线' : '离线'} {camera.position && ( 位置 {camera.position} )} {camera.resolution && ( 分辨率 {camera.resolution} )} {camera.gbDeviceId && ( 国标ID {camera.gbDeviceId} )} )} {error && ( ⚠️ {error} )} ); }; export default VideoPlayerPage;