[Feature][添加测试程序]

This commit is contained in:
like 2025-04-29 16:23:41 +08:00
parent f2146d30df
commit cd1270f500
3 changed files with 140 additions and 0 deletions

29
CMakeLists.txt Normal file
View File

@ -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
)

12
build.sh Executable file
View File

@ -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/

99
source/main.cpp Normal file
View File

@ -0,0 +1,99 @@
#include <iostream>
#include <opencv2/opencv.hpp>
#include <thread>
#include <queue>
#include <mutex>
#include <condition_variable>
#include <atomic>
// 全局变量
std::queue<cv::Mat> frameQueue;
std::mutex queueMutex;
std::condition_variable queueCondition;
std::atomic<bool> isRecording(false);
std::atomic<bool> 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<std::mutex> 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<std::mutex> 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<std::mutex> 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;
}