首先通过做下测试了解RTSP视频推流的详细过程
1.使用VLC界面推拉流测试
使用VLC media player对视频做RTSP格式的推流与拉流测试
2.使用VLC 通过代码推拉流测试
vlc test.mp4 --sout '#rtp{sdp=rtsp://:8554/live}' --sout-keep
本地拉流注意本地ip地址为127.0.0.1
vlc rtsp://127.0.0.1:8554/live
3.实现opencv读取图像后用RTSP推流并用vlc实现拉流
3.1Ubuntu 20.04 上安装 mediamtx(原 rtsp-simple-server)并执行服务器:
在https://github.com/bluenviron/mediamtx
点可执行文件mediamtx_v1.13.0_linux_amd64.tar.gz下载后执行。
./mediamtx
3.2如果笔记本有摄像头直接打开摄像头并使用ffmpeg推流,代码如下
#include <opencv2/opencv.hpp>
#include <cstdio>
int main() {
cv::VideoCapture cap(0);
if (!cap.isOpened()) {
std::cerr << "Error: Could not open video source." << std::endl;
return -1;
}
int frame_width = cap.get(cv::CAP_PROP_FRAME_WIDTH);
int frame_height = cap.get(cv::CAP_PROP_FRAME_HEIGHT);
double fps = cap.get(cv::CAP_PROP_FPS);
if (fps <= 0) fps = 30;
// 构建 FFmpeg 命令字符串
std::string ffmpeg_cmd =
"ffmpeg -y -f rawvideo -pixel_format bgr24 -video_size " +
std::to_string(frame_width) + "x" + std::to_string(frame_height) +
" -framerate " + std::to_string(fps) +
" -i - -c:v libx264 -preset ultrafast -tune zerolatency -f rtsp rtsp://localhost:8554/mystream";
// 转换为 C 风格字符串
FILE *ffmpeg_pipe = popen(ffmpeg_cmd.c_str(), "w"); // 关键修改:使用 .c_str()
if (!ffmpeg_pipe) {
std::cerr << "Error: Could not open FFmpeg pipe." << std::endl;
return -1;
}
std::cout << "RTSP Streaming started: rtsp://localhost:8554/mystream" << std::endl;
cv::Mat frame;
while (true) {
cap >> frame;
if (frame.empty()) break;
// 写入 FFmpeg 管道
fwrite(frame.data, 1, frame.total() * frame.elemSize(), ffmpeg_pipe);
cv::imshow("RTSP Streaming", frame);
if (cv::waitKey(1) == 27) break; // ESC 退出
}
pclose(ffmpeg_pipe);
cap.release();
cv::destroyAllWindows();
return 0;
}
CmakeLists.txt
cmake_minimum_required(VERSION 3.5)
project(opencv_rtsp_push LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
find_package(OpenCV REQUIRED)
add_compile_options(-g -O0)
add_executable(opencvCalib main.cpp)
target_link_libraries(opencvCalib
${OpenCV_LIBRARIES}
)
编译运行
./opencv_rtsp_push
3.3 打开VLC并显示视频
vlc rtsp://localhost:8554/mystream