我正在尝试读取视频文件并将帧存储为一系列图像。我正在使用VideoReader,但由于某些原因,我遇到了麻烦。我想存储以不同方式编码的两个视频的帧,并逐帧测量两者之间的结构相似性和PSNR。
基本上,我有三个视频文件,一个原始文件(看起来不错),一个使用ffmpeg用VP9压缩,一个使用ffmpeg用H.624压缩。原始视频最初只是一组使用VirtualDub合并为.avi视频的帧。压缩的视频也是.avi容器。
VP9视频似乎可以正常工作,但是当我使用imshow()打开图像时,它们似乎只是纯绿色。视频在VLC上可以正常打开,所以我不确定是什么问题。
完全看不到H.264视频。当它尝试进入“ while hasFrame()”循环时,会跳过该循环,从而导致Matlab认为视频帧不在其中?同样,此视频在VLC中可以正常打开,并且三个视频看起来几乎相同。
任何人都知道为什么会这样吗?这与Matlab解码视频或ffmpeg设置的某些参数的方式有关吗?
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是完成任务的最佳选择,还是那里有专门的软件来执行此任务?
答案 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#psnr和http://www.ffmpeg.org/ffmpeg-filters.html#ssim