【问题标题】:Matlab VideoReader reading frames as green images or just not at allMatlab VideoReader 将帧读取为绿色图像或根本不读取
【发布时间】:2019-09-20 23:39:50
【问题描述】:

我正在尝试读取视频文件并将帧存储为一系列图像。我正在使用 VideoReader,但由于某种原因我遇到了麻烦。我想存储两个以不同方式编码的视频的帧,并逐帧测量两者之间的结构相似性和 PSNR。

基本上我有三个视频文件,一个原始文件(读起来很好),一个使用 ffmpeg 用 VP9 压缩,一个使用 ffmpeg 用 H.624 压缩。原始视频最初只是使用 VirtualDub 将一组帧合并成一个 .avi 视频。压缩视频也是 .avi 容器。

VP9 视频看起来工作正常,但是当我使用 imshow() 打开图像时,它们似乎只是纯绿色。该视频在 VLC 上打开正常,所以我不确定问题是什么。

H.264 视频根本无法读取。当它尝试进入“while hasFrame()”循环时,它会跳过它,这会导致认为 Matlab 认为视频帧不存在?同样,该视频在 VLC 中打开良好,三个视频看起来几乎相同。

有人知道为什么会这样吗?是和matlab解码视频的方式还是ffmpeg设置的一些参数有关?

Original vs VP9 in Matlab

Console output for ffmpeg - VP9

Console output for ffmpeg - H264

主文件:

test_vid = 'vp9.avi';
images = readVideos(test_vid);

for i=1:length(images)

  % Convert from cells to matrices
  image1 = cell2mat(images(1,i));
  image2 = cell2mat(images(2,i));

  % Do stuff with the images here

  subplot(1,2,1);
  imshow(image1);
  subplot(1,2,2);
  imshow(image2);
end

ReadVideos():

function images = readVideos(test_video)

    % Video directories
    test_video_dir = strcat('src/', test_video);
    v_original = VideoReader('src/input.avi');
    v_test = VideoReader(test_video_dir);

    % Read original video
    i = 1;
    v_original.CurrentTime = 5;
    while hasFrame(v_original)
        frame = readFrame(v_original);
        originalImages{i} = frame;
        i = i + 1;
    end

    % Read test video
    i = 1;
    v_test.CurrentTime = 5;
    while hasFrame(v_test)
         frame = readFrame(v_test);
         testImages{i} = frame;
         i = i + 1;
    end

    images = cat(1, originalImages, testImages);
end

顺便说一句,Matlab 是完成这项任务的最佳选择,还是有专门的软件可以做到这一点?

【问题讨论】:

    标签: matlab image-processing ffmpeg video-processing codec


    【解决方案1】:

    对于most part,Matlab 的 Videoreader 依赖于操作系统提供的解码器。一般来说,这些解码器对像素格式的流的支持有限,而不是最常见的格式。这里似乎就是这种情况。

    您的 VP9 输出为gbrp,即平面(8 位)RGB。您的 H.264 输出是 YUV,但具有 4:4:4 色度采样。这两个都是非标准的。

    要使用 Videoreader 读取这些文件,请转换为标准像素格式:

    ffmpeg -i input.avi -pix_fmt yuv420p -c:v libvpx-vp9 vp9.avi
    

    ffmpeg -i input.avi -pix_fmt yuv420p -c:v libx264 h264.avi
    

    但是,您在执行质量指标比较时可能会遇到问题,因为它们要求两个操作数具有相同的像素格式。 Matlab 可能会也可能不会自动转换它们。


    您可以在 ffmpeg 中执行质量检查。

    ffmpeg -i input.avi -pix_fmt gbrp -c:v libvpx-vp9 vp9.mkv
    

    ffmpeg -i input.avi -pix_fmt gbr24 -c:v libx264rgb h264.mkv
    

    然后

    ffmpeg -i input.avi -i vp9.mkv -i h264.mkv -filter_complex "[1][0]psnr=f=vp9-psnr.txt:stats_version=2;[1][0]ssim=f=vp9-ssim.txt;[2][0]psnr=f=h264-psnr.txt:stats_version=2;[2][0]ssim=f=h264-ssim.txt" -f null -

    http://www.ffmpeg.org/ffmpeg-filters.html#psnrhttp://www.ffmpeg.org/ffmpeg-filters.html#ssim

    【讨论】:

    • 您好 Gyan,感谢您的回答!您的解决方案非常适用于 H264,但是我仍然遇到与 VP9 相同的问题,有什么想法吗?另外,感谢您的第二个建议,这是一种很好的方法,我正在通过它获得 VP9 的结果。 Matlab 和 ffmpeg 的质量检查结果(至少对于 H264)略有不同(SSIM 大约为 4/5%),您对哪种方法更可靠有什么想法吗?
    • 我在 VP9 上仍然遇到同样的问题,有什么想法吗? --> 我认为没有为 VP9 安装 Directshow/Windows Media Foundation 解码器。
    • Matlab 将执行一些像素格式转换 - 无论是在参考视频还是转码视频上。我会坚持使用 ffmpeg 过滤器。
    猜你喜欢
    • 1970-01-01
    • 2014-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-07
    相关资源
    最近更新 更多