我正在尝试通过将它们设置为从特定起点播放而不是从头开始播放来自定义我添加到MatLab的视频的播放。
使用MathWorks' VideoReader,我可以确定目标开始帧,持续时间,帧速率等。
如何告诉MatLab播放我的视频,比如3秒或5秒标记?或者我选择的任何其他标记?
答案 0 :(得分:1)
你可以通过使用VideoReader做一件事,你将获得包含帧和音频的整个视频。现在你像这样分开LET ASSUME 10秒视频CONTAINS 200 FRAMES,开始时间是2秒,结束时间是4秒。 所以2秒视频= 40帧和4秒视频= 80。现在为第40帧到第80帧放置一个循环,然后将其存储在临时变量中。然后使用电影播放那些帧。我认为以下代码将用于您。
sampling_factor = 8;
resizing_params = [100 120];
%%// Input video
xyloObj = VideoReader('xylophone.mpg');
%%// Setup other parameters
nFrames = floor(xyloObj.NumberOfFrame/sampling_factor); %%// xyloObj.NumberOfFrames;
vidHeight = resizing_params(1); %// xyloObj.Height;
vidWidth = resizing_params(1); %// xyloObj.Width;
% here i am play 4 sec movie to 2 to 3
info = get(xyloObj);
duration =info.Duration;
startframe =round( nFrames *2/duration); % 2 means starting duration in sec
endframe = round( nFrames *4/duration); % 4 means ending duration in sec
%// Preallocate movie structure.
temp(1:nFrames) = struct('cdata', zeros(vidHeight, vidWidth, 3, 'uint8'),'colormap',[]);
mov = temp(1:endframe-startframe) ;
indx =1;
%// Read one frame at a time.
for k = 1 :nFrames
if k >=startframe && k <=endframe
IMG = read(xyloObj, (k-1)*sampling_factor+1);
%// IMG = some_operation(IMG);
mov(indx).cdata = imresize(IMG,[vidHeight vidWidth]);
indx =indx +1;
end
end
%// Size a figure based on the video's width and height.
hf = figure;
set(hf, 'position', [150 150 vidWidth vidHeight])
%// Play back the movie once at the video's frame rate.
movie(hf, mov, 1, xyloObj.FrameRate);
答案 1 :(得分:0)
如果您运行14b或更高版本,VideoReader会有一个名为CurrentTime的属性,您可以设置。
所以你可以说
vidObj = VideoReader('xylophone.mpg');
vidObj.CurrentTime = 2; % 2 seconds;
readFrame(vidObj);
希望这有帮助。