gpt4 book ai didi

Java OpenCV 打开视频文件问题

转载 作者:行者123 更新时间:2023-12-04 23:18:44 26 4
gpt4 key购买 nike

我有一个灰度 .mkv 视频,我想用 Java 中的 OpenCV 打开它,但出现以下错误:
return new VideoCapture(path, Videoio.CAP_FFMPEG);错误:

[ERROR:0@0.004] global /build/opencv/modules/videoio/src/cap_ffmpeg_impl.hpp (1108) open Could not find decoder for codec_id=61
[ERROR:0@0.004] global /build/opencv/modules/videoio/src/cap_ffmpeg_impl.hpp (1140) open VIDEOIO/FFMPEG: Failed to initialize VideoCapture
return new VideoCapture(path, Videoio.CAP_DSHOW);没有错误,但是 video.isOpened()是假的
return new VideoCapture(path);错误:
[ERROR:0@0.005] global /build/opencv/modules/videoio/src/cap_ffmpeg_impl.hpp (1108) open Could not find decoder for codec_id=61
[ERROR:0@0.005] global /build/opencv/modules/videoio/src/cap_ffmpeg_impl.hpp (1140) open VIDEOIO/FFMPEG: Failed to initialize VideoCapture
[ WARN:0@0.122] global C:\build\master_winpack-bindings-win64-vc14-static\opencv\modules\videoio\src\cap_msmf.cpp (923) CvCapture_MSMF::initStream Failed to set mediaType (stream 0, (480x360 @ 1) MFVideoFormat_RGB24(codec not found)
我已安装 OpenCV 并将其添加为依赖项 using this video .
我也试过添加 ...\opencv\build\bin\opencv_videoio_ffmpeg455_64.dll到 native 库,并尝试使用: System.load("path\\to\\opencv\\build\\bin\\opencv_videoio_ffmpeg455_64.dll"); .
完整代码:
public class Test {
static {
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
System.load("path\\to\\opencv\\build\\bin\\opencv_videoio_ffmpeg455_64.dll");
}

public static void main(String[] args) {
List<Mat> frames = getVideoFrames(openVideoFile(args[0]));
System.out.println(frames.size());
}
}
//... different class
public static VideoCapture openVideoFile(String path) {
return new VideoCapture(path);
}

public static List<Mat> getVideoFrames(VideoCapture video) {
List<Mat> frames = new ArrayList<>();
Mat frame = new Mat();

if (video.isOpened()) {
while (video.read(frame)) {
frames.add(frame);
}
video.release();
}

return frames;
}
ffprobe结果:
  Metadata:
MAJOR_BRAND : qt
MINOR_VERSION : 512
COMPATIBLE_BRANDS: qt
ENCODER : Lavf56.40.101
Duration: 00:01:05.83, start: 0.000000, bitrate: 1511 kb/s
Stream #0:0(eng): Video: png (MPNG / 0x474E504D), rgb24(pc), 480x360 [SAR 1:1 DAR 4:3], 6 fps, 6 tbr, 1k tbn (default)
Metadata:
LANGUAGE : eng
HANDLER_NAME : DataHandler
ENCODER : Lavc56.60.100 png
DURATION : 00:01:05.834000000

最佳答案

错误消息表明 OpenCV 的 FFmpeg 插件未使用 MPNG 编解码器支持构建。因此,您基本上只能通过 OpenCV 完成此任务(您可以请求 OpenCV 支持编解码器,但即使您成功说服他们的开发人员这样做也不会很快适应)。作为非 Java/非 OpenCV 的人(我通常处理 Python/FFmpeg),我可以想到以下几点:
1a) 如果您可以控制数据的上游,请将视频编解码器从 MPNG 更改为支持 OpenCV 的编解码器。
1b) 转码 MKV 文件以在您的程序中使用支持的编解码器重新编码视频流

  • 创建一个线程并从 Java 调用 ffmpeg 作为子进程(我认为 ProcessBuilder 是您感兴趣的类)并通过标准输出管道加载视频数据。 FFmpeg可以通过以下方式调用:
  • ffmpeg -i <video_path> -f rawvideo -pix_fmt gray -an -
    标准输出管道每帧将接收 480x360 字节。一次读取尽可能多的帧。如果您需要限制帧数,您需要使用 -ss 在几秒钟内完成。 , -t , 和/或 -to选项。
    我假设这个视频是你提到的灰度视频(ffprobe 表示视频以 RGB 格式保存)。如果需要获取 RGB,请使用 -pix_fmt rgb24和视频帧数据。
    一旦你在内存中有图像数据,应该有一个 OpenCV 函数来从内存数据创建一个图像对象。

    关于Java OpenCV 打开视频文件问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71278678/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com