From cd1270f500282c9752a670133a083b1b1ae19eea Mon Sep 17 00:00:00 2001 From: like Date: Tue, 29 Apr 2025 16:23:41 +0800 Subject: [PATCH] =?UTF-8?q?[Feature][=E6=B7=BB=E5=8A=A0=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E7=A8=8B=E5=BA=8F]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CMakeLists.txt | 29 +++++++++++++++ build.sh | 12 ++++++ source/main.cpp | 99 +++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 140 insertions(+) create mode 100644 CMakeLists.txt create mode 100755 build.sh create mode 100644 source/main.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 00000000..6820989b --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,29 @@ +cmake_minimum_required(VERSION 3.10) +project(universal_camera_sdk) + +# 设置 C++ 标准 +set(CMAKE_CXX_STANDARD 11) +set(THIRDPARTY "${CMAKE_CURRENT_SOURCE_DIR}/thirdparty") + +# 查找 OpenCV 库 +set(OpenCV_DIR ${THIRDPARTY}/opencv_build/x86_64/install/lib/cmake/opencv4) # 根据实际 OpenCV 安装路径修改 +find_package(OpenCV REQUIRED) + +# 包含 OpenCV 头文件 +include_directories(${OpenCV_INCLUDE_DIRS}) + +# 添加可执行文件 +add_executable(universal_camera_sdk source/main.cpp) + +# 链接 OpenCV 静态库 +target_link_libraries(universal_camera_sdk ${OpenCV_LIBS}) + +# 链接 FFmpeg 和 x264 静态库(OpenCV 已包含相关依赖,这里可能无需额外指定) +# 若需要可添加以下内容 +target_link_libraries(universal_camera_sdk + ${THIRDPARTY}/ffmpeg_build/x86_64/install/lib/libavcodec.a + ${THIRDPARTY}/ffmpeg_build/x86_64/install/lib/libavformat.a + ${THIRDPARTY}/ffmpeg_build/x86_64/install/lib/libavutil.a + ${THIRDPARTY}/ffmpeg_build/x86_64/install/lib/libswscale.a + ${THIRDPARTY}/x264_build/x86_64/install/lib/libx264.a +) diff --git a/build.sh b/build.sh new file mode 100755 index 00000000..9309f797 --- /dev/null +++ b/build.sh @@ -0,0 +1,12 @@ +#!/bin/bash + +if [ -d out ]; then + rm -rf out +fi + +mkdir out +cd out +cmake .. +make -j4 + +cp -a universal_camera_sdk /mnt/c/Users/LIKE/Desktop/ diff --git a/source/main.cpp b/source/main.cpp new file mode 100644 index 00000000..088a6f06 --- /dev/null +++ b/source/main.cpp @@ -0,0 +1,99 @@ +#include +#include +#include +#include +#include +#include +#include + +// 全局变量 +std::queue frameQueue; +std::mutex queueMutex; +std::condition_variable queueCondition; +std::atomic isRecording(false); +std::atomic stopRecording(false); + +// 帧获取线程函数 +void frameCaptureThread() { + cv::VideoCapture cap("/dev/video2"); + if (!cap.isOpened()) { + std::cerr << "无法打开摄像头" << std::endl; + return; + } + // 设置分辨率和帧率 + cap.set(cv::CAP_PROP_FRAME_WIDTH, 1920); + cap.set(cv::CAP_PROP_FRAME_HEIGHT, 1080); + cap.set(cv::CAP_PROP_FPS, 25); + + cv::Mat frame; + while (isRecording) { + if (cap.read(frame)) { + std::unique_lock lock(queueMutex); + frameQueue.push(frame.clone()); + lock.unlock(); + queueCondition.notify_one(); + } + } + cap.release(); +} + +// 帧保存线程函数 +void frameSavingThread(const std::string& outputPath) { + cv::Size frameSize(1920, 1080); + int fps = 25; + cv::VideoWriter writer(outputPath, cv::VideoWriter::fourcc('H', '2', '6', '4'), fps, frameSize); + if (!writer.isOpened()) { + std::cerr << "无法打开视频写入器" << std::endl; + return; + } + + while (!stopRecording || !frameQueue.empty()) { + std::unique_lock lock(queueMutex); + queueCondition.wait(lock, [] { return!frameQueue.empty() || stopRecording; }); + + while (!frameQueue.empty()) { + cv::Mat frame = frameQueue.front(); + frameQueue.pop(); + writer.write(frame); + } + } + writer.release(); +} + +// 开始录像函数 +void startRecording(const std::string& outputPath) { + isRecording = true; + stopRecording = false; + + std::thread captureThread(frameCaptureThread); + std::thread savingThread(frameSavingThread, outputPath); + + captureThread.detach(); + savingThread.detach(); +} + +// 停止录像函数 +void stopRecordingFunction() { + isRecording = false; + stopRecording = true; + { + std::unique_lock lock(queueMutex); + queueCondition.notify_one(); + } +} + +int main() { + // 定义输出视频的参数 + std::string outputPath = "output.mp4"; + + // 开始录像 + startRecording(outputPath); + + // 模拟录制一段时间 + std::this_thread::sleep_for(std::chrono::seconds(10)); + + // 停止录像 + stopRecordingFunction(); + + return 0; +} \ No newline at end of file