我试图运行位于这里的存储库。基本上,只是针对使用 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。没有一个起作用并抛出类似的错误。
有什么问题吗?怎么解决?
我基本上用“mp4v”替换了“MP4V”并解决了这个问题。看来 API 是区分大小写的。
我通过安装 ffmpeg 修复了 macOS 上的类似问题:
macOS:
brew install ffmpeg
Ubuntu:
sudo apt install ffmpeg
对于由于同样的错误而陷入困境的任何人,要将帧写入
.mp4
输出文件,请使用这些字符作为参数:
cv.VideoWriter_fourcc('m', 'p', '4', 'v')
或
cv.VideoWriter_fourcc('H','2','6','4')
在您的代码中尝试替换
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))
您必须使用
'a', 'v', 'c', '1'
(avc1
),因为 MP4 容器中似乎实际上不允许使用“H264”。至少,ffmpeg 抱怨这是不允许的。
mp4v
不是 H.264。 mp4v
是之前的压缩标准,由DivX/XviD实现。