opencv4.10 c++ 读取avi,mp4视频,并别存为一个新的视频

发布于:2024-07-04 ⋅ 阅读:(106) ⋅ 点赞:(0)

视频保存(直接转换另存不播放)

#include <opencv2/opencv.hpp>
#include <iostream>

int main() {
    // 读取输入视频
    cv::VideoCapture inputVideo("1.avi");
    if (!inputVideo.isOpened()) {
        std::cerr << "无法打开输入视频文件" << std::endl;
        return -1;
    }

    // 获取视频帧的宽度、高度和帧率
    int frameWidth = static_cast<int>(inputVideo.get(cv::CAP_PROP_FRAME_WIDTH));
    int frameHeight = static_cast<int>(inputVideo.get(cv::CAP_PROP_FRAME_HEIGHT));
    double fps = inputVideo.get(cv::CAP_PROP_FPS);

    // 定义视频编码器和输出视频文件
    cv::VideoWriter outputVideo("2.avi", cv::VideoWriter::fourcc('M', 'J', 'P', 'G'), fps, cv::Size(frameWidth, frameHeight));
    if (!outputVideo.isOpened()) {
        std::cerr << "无法打开输出视频文件" << std::endl;
        return -1;
    }

    cv::Mat frame;
    while (true) {
        // 读取视频帧
        inputVideo >> frame;
        if (frame.empty()) {
            break; // 视频结束
        }

        // 写入视频帧到输出文件
        outputVideo.write(frame);
    }

    std::cout << "视频处理完成" << std::endl;
    return 0;
}

播放并另存

#include <opencv2/opencv.hpp>
#include <iostream>

int main() {
    // 读取输入视频
    cv::VideoCapture inputVideo("1.avi");
    if (!inputVideo.isOpened()) {
        std::cerr << "无法打开输入视频文件" << std::endl;
        return -1;
    }

    // 获取视频帧的宽度、高度和帧率
    int frameWidth = static_cast<int>(inputVideo.get(cv::CAP_PROP_FRAME_WIDTH));
    int frameHeight = static_cast<int>(inputVideo.get(cv::CAP_PROP_FRAME_HEIGHT));
    double fps = inputVideo.get(cv::CAP_PROP_FPS);

    // 定义视频编码器和输出视频文件
    cv::VideoWriter outputVideo("2.avi", cv::VideoWriter::fourcc('M', 'J', 'P', 'G'), fps, cv::Size(frameWidth, frameHeight));
    if (!outputVideo.isOpened()) {
        std::cerr << "无法打开输出视频文件" << std::endl;
        return -1;
    }

    cv::Mat frame;
    while (true) {
        // 读取视频帧
        inputVideo >> frame;
        if (frame.empty()) {
            break; // 视频结束
        }

        // 显示视频帧
        cv::imshow("Video Playback", frame);

        // 写入视频帧到输出文件
        outputVideo.write(frame);

        // 按键响应,按 'q' 键退出
        if (cv::waitKey(30) == 'q') {
            break;
        }
    }

    std::cout << "视频处理完成" << std::endl;
    return 0;
}