OpenCV:FFMPEG:编解码器 ID 12 和格式“mp4 / MP4

问题描述 投票:0回答:4

我试图运行位于这里的存储库。基本上,只是针对使用 OpenCV 进行一些基本视频处理的

SimpleVideoSummarizer.cc
。我使用的是 Ubuntu 14.04。以下是保存部分的代码:

void SimpleVideoSummarizer::playAndSaveSummaryVideo(char* videoFileSave) {
    cv::VideoCapture capture(videoFile);
    cv::Mat frame;
    capture.set(CV_CAP_PROP_POS_FRAMES, 0);
    cv::VideoWriter videoWriter;
    if (videoFileSave != "") {
        videoWriter = cv::VideoWriter(videoFileSave, CV_FOURCC('M', 'J', 'P', 'G'), static_cast<int>(capture.get(CV_CAP_PROP_FPS)), cv::Size(capture.get(CV_CAP_PROP_FRAME_WIDTH), capture.get(CV_CAP_PROP_FRAME_HEIGHT)));
    }
    for (std::set<int>::iterator it = summarySet.begin(); it != summarySet.end(); it++) {
        capture.set(CV_CAP_PROP_POS_FRAMES, segmentStartTimes[*it] * frameRate);
        for (int i = segmentStartTimes[*it]; i < segmentStartTimes[*it + 1]; i++) {
            for (int j = 0; j < frameRate; j++) {
                capture >> frame;
                cv::putText(frame, "Time: " + IntToString(i) + " seconds", cvPoint(30, 30),
                            cv::FONT_HERSHEY_COMPLEX_SMALL, 0.8, cvScalar(200, 200, 250), 1, CV_AA);
                if (frame.data) {
                    cv::imshow("Summary Video", frame);
                }
                if (videoFileSave != "") {
                    videoWriter.write(frame);
                }
                // Press  ESC on keyboard to exit
                char c = static_cast<char>(cv::waitKey(25));
                if (c == 27) {
                    break;
                }
            }
        }
    }
    capture.release();
}

我传递了一个

input.mp4
文件并指定了一个
out.mp4
。不幸的是,当该示例尝试保存输出视频文件时,它会在 FOURCC 上抛出错误:

OpenCV: FFMPEG: tag 0x44495658/'XVID' is not supported with codec id 12 and format 'mp4 / MP4 (MPEG-4 Part 14)'
OpenCV: FFMPEG: fallback to use tag 0x7634706d/'mp4v'

或另一个:

OpenCV: FFMPEG: tag 0x3234504d/'MP42' is not supported with codec id 15 and format 'mp4 / MP4 (MPEG-4 Part 14)'
[mp4 @ 0x16bc700] Could not find tag for codec msmpeg4v2 in stream #0, codec not currently supported in container

我尝试更改编写视频的这部分代码中的FOURCC,并应用了XVID、MJPG、X264、MP42、MP4V。没有一个起作用并抛出类似的错误。

有什么问题吗?怎么解决?

c++ opencv ffmpeg mp4 fourcc
4个回答
31
投票

我基本上用“mp4v”替换了“MP4V”并解决了这个问题。看来 API 是区分大小写的。


1
投票

我通过安装 ffmpeg 修复了 macOS 上的类似问题:

macOS:

brew install ffmpeg

Ubuntu:

sudo apt install ffmpeg

1
投票

对于由于同样的错误而陷入困境的任何人,要将帧写入

.mp4
输出文件,请使用这些字符作为参数:

cv.VideoWriter_fourcc('m', 'p', '4', 'v')

cv.VideoWriter_fourcc('H','2','6','4')
  • 取决于您系统上可用的编解码器。
  • 在 Ubuntu 20.04 上测试。

在您的代码中尝试替换

CV_FOURCC('M', 'J', 'P', 'G')

CV_FOURCC('m', 'p', '4', 'v')

我在这个GitHub评论的帮助下解决了我的问题。

如果没有帮助,请考虑 NVIDIA 论坛 中的这篇文章,并直接在

cv2.VideoWriter()
中插入 ASCII 数字,而不使用
cv2.VideoWriter_fourcc()
,例如:

cv2.VideoWriter('output.mp4', 0x00000021, 15.0, (1280,360))

0
投票

您必须使用

'a', 'v', 'c', '1'
(
avc1
),因为 MP4 容器中似乎实际上不允许使用“H264”。至少,ffmpeg 抱怨这是不允许的。

mp4v
不是 H.264。
mp4v
是之前的压缩标准,由DivX/XviD实现。

© www.soinside.com 2019 - 2024. All rights reserved.