Matlab VideoReader阅读框架为绿色图像或根本不显示

时间:2019-05-02 12:37:06

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

我正在尝试读取视频文件并将帧存储为一系列图像。我正在使用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是完成任务的最佳选择,还是那里有专门的软件来执行此任务?

1 个答案:

答案 0 :(得分: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