php实现录像功能
PHP实现录像功能的基本方法
PHP本身是服务器端脚本语言,无法直接操作客户端摄像头进行录像。需要通过前端技术(如HTML5、JavaScript)结合PHP后端实现。以下是实现方案:
前端采集视频流
使用HTML5的getUserMedia API获取摄像头视频流,并通过MediaRecorder录制:
<video id="preview" autoplay muted></video>
<button id="start">开始录制</button>
<button id="stop">停止录制</button>
<script>
const preview = document.getElementById('preview');
const startBtn = document.getElementById('start');
const stopBtn = document.getElementById('stop');
let mediaRecorder;
let recordedChunks = [];
navigator.mediaDevices.getUserMedia({ video: true, audio: true })
.then(stream => {
preview.srcObject = stream;
mediaRecorder = new MediaRecorder(stream);
mediaRecorder.ondataavailable = e => {
if (e.data.size > 0) recordedChunks.push(e.data);
};
mediaRecorder.onstop = () => {
const blob = new Blob(recordedChunks, { type: 'video/webm' });
recordedChunks = [];
uploadVideo(blob);
};
});
startBtn.addEventListener('click', () => mediaRecorder.start());
stopBtn.addEventListener('click', () => mediaRecorder.stop());
function uploadVideo(blob) {
const formData = new FormData();
formData.append('video', blob, 'recording.webm');
fetch('upload.php', {
method: 'POST',
body: formData
});
}
</script>
PHP接收并保存视频
创建upload.php处理上传的视频文件:

<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['video'])) {
$uploadDir = 'uploads/';
$filename = uniqid() . '.webm';
$destination = $uploadDir . $filename;
if (!is_dir($uploadDir)) {
mkdir($uploadDir, 0755, true);
}
if (move_uploaded_file($_FILES['video']['tmp_name'], $destination)) {
echo json_encode(['status' => 'success', 'file' => $filename]);
} else {
echo json_encode(['status' => 'error']);
}
}
?>
视频格式转换处理
WEBM格式可能需要转换为MP4等更通用格式。可使用FFmpeg:
$inputFile = 'uploads/recording.webm';
$outputFile = 'uploads/recording.mp4';
exec("ffmpeg -i $inputFile -c:v libx264 -c:a aac $outputFile");
安全注意事项
设置上传文件大小限制:

ini_set('upload_max_filesize', '100M');
ini_set('post_max_size', '100M');
验证文件类型:
$allowedTypes = ['video/webm', 'video/mp4'];
if (!in_array($_FILES['video']['type'], $allowedTypes)) {
die('Invalid file type');
}
数据库记录存储
将视频信息存入MySQL数据库:
$pdo = new PDO('mysql:host=localhost;dbname=video_db', 'username', 'password');
$stmt = $pdo->prepare("INSERT INTO videos (filename, path, created_at) VALUES (?, ?, NOW())");
$stmt->execute([$filename, $destination]);
视频流直播方案
如需实现直播而非录制,可使用WebRTC技术配合PHP信令服务器,或使用RTMP协议推流到媒体服务器如Nginx-RTMP。






