OpenCV:FFMPEG:tag不支持codec id 12和格式“mp4 / MP4”

anhgbhbe  于 2023-10-24  发布在  其他
关注(0)|答案(4)|浏览(547)

我试图运行一个位于HERE的存储库。基本上,只是针对SimpleVideoSummarizer.cc,它使用OpenCV进行一些基本的视频处理。我使用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.没有工作,抛出类似的错误.

问题是什么?如何解决?

5q4ezhmt

5q4ezhmt1#

我基本上把"mp4v“换成了”mp4v",解决了这个问题。看起来API是大小写敏感的。

oyjwcjzk

oyjwcjzk2#

对于由于相同错误而滞留在这里的任何人,要将帧写入.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 forum的这篇文章,并直接在cv2.VideoWriter()中插入ASCII数字,而不是像这样使用cv2.VideoWriter_fourcc()

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

zzlelutf3#

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

brew install ffmpeg

Ubuntu:

sudo apt install ffmpeg
kokeuurv

kokeuurv4#

您必须使用**'a', 'v', 'c', '1'**(avc1)来请求H.264。
ffmpeg认为“H264”在MP4容器中是无效的fourcc。
mp4v不是H.264。mp4v是以前的压缩标准,由DivX/XviD实现。

相关问题