2015-06-11 6 views
2

У меня есть 2 видео, которые я хотел бы играть бок о бок в разделенном экране. Они имеют одинаковую продолжительность и размеры. Я нашел код, разработанный несколько лет назад, чтобы выполнить эту работу. Проблема в том, что она полна ошибок, возможно, из-за того, что я использую более новую версию Matlab (2014a). Ошибки начинаются с (% name нового avi-файла).Matlab - объединить два видео в одно видео с разделенным экраном

Может кто-нибудь пожалуйста, попытаться исправить:

% select two files: 
[filename1,pathname1] = uigetfile('.avi','pick first AVI file'); 
[filename2,pathname2] = uigetfile('.avi','pick second AVI file'); 
file1 = fullfile(pathname1,filename1); 
file2 = fullfile(pathname2,filename2); 
pdMovie1 = aviread(file1); 
pdMovie2 = aviread(file2); 
fileinfo1 = aviinfo(file1); 
fileinfo2 = aviinfo(file2); 

% check if AVI files have the same length and height: 
if fileinfo1.NumFrames~=fileinfo2.NumFrames || ... 
    fileinfo1.Height~=fileinfo2.Height 
errordlg('files are not compatible!') 
else 
% inspired by Herbert Ramoser in Message-ID: 
% <[email protected]> 
for i=1:size(pdMovie1,2) 
    output(i).cdata = [pdMovie1(i).cdata, pdMovie2(i).cdata]; 
    output(i).colormap = pdMovie1(i).colormap; 
end; 

% name of the new avi file: 
[pathstr,name,ext,versn] = fileparts(filename1); 
newmoviename = [pathname1,name,'_combined', ... 
       num2str(fileinfo1.FramesPerSecond;),ext]; 

% create the avi file: 
movie2avi(output, newmoviename, ... 
      'fps', fileinfo1.FramesPerSecond;, ... 
      'compression', 'none'); 
close 
end 

ответ

4

Если это просто для воспроизведения видео бок о бок, это simplker код будет работать,

close all 
clc 
clear 

vid1 = vision.VideoFileReader('video1.avi'); 
vid2 = vision.VideoFileReader('video2.avi'); 
vidP = vision.VideoPlayer; 

while ~isDone(vid1) 
    frame1 = step(vid1); 
    frame2 = step(vid2); 

    frame = horzcat(frame1, frame2); 

    step(vidP,frame); 
end 

release(vid1); 
release(vid2); 
release(vidP); 

UPDATE: I Предполагая, что оба входных видео имеют одинаковую длину и размер кадра.

Хорошо, теперь, если вы хотите, чтобы записать новое видео с первым 2, с той же частотой кадров предыдущих, то лучше использовать следующий код,

close all 
clc 
clear 

vid1 = VideoReader('video1.avi'); 
vid2 = VideoReader('video2.avi'); 

videoPlayer = vision.VideoPlayer; 

% new video 
outputVideo = VideoWriter('newvideo.avi'); 
outputVideo.FrameRate = vid1.FrameRate; 
open(outputVideo); 

while hasFrame(vid1) && hasFrame(vid2) 
    img1 = readFrame(vid1); 
    img2 = readFrame(vid2); 

    imgt = horzcat(img1, img2); 

    % play video 
    step(videoPlayer, imgt); 

    % record new video 
    writeVideo(outputVideo, imgt); 
end 

release(videoPlayer); 
close(outputVideo); 
+0

Спасибо, воспроизведение работает отлично, но как его сохранить как файл .avi? – Mosawi

+0

Я отредактировал свой ответ. – SamuelNLP

+0

Еще раз спасибо, но теперь я получаю следующую ошибку, любой шанс ее можно исправить? Неопределенная функция hasFrame для входных аргументов типа «VideoReader». Ошибка в videosidebyside (строка 11) в то время как hasFrame (VID1) && hasFrame (VID2) в то время как hasFrame (VID1) && hasFrame (VID2) – Mosawi

0

Если у вас есть два видео клипы с различными частотами кадров и разрешениями, или вы хотели бы присоединиться/отрезать пару видеороликов, используйте приведенный ниже код.

Например: Моя фотокамера позволяет записывать видео спереди и сзади автомобиля в одно и то же время. Но передние и задние видеоролики появляются в отдельных файлах. Я хочу показать их бок о бок, а также объединить 6 файлов (3 пары) в один файл.

%Read video 
clc 
clear 
vidObj_f = VideoReader('video1.mp4'); 
FrameRate_f = vidObj_f.FrameRate; 
vidObj_b = VideoReader('video2.mp4'); 
FrameRate_b = vidObj_b.FrameRate; 

%New video 
outputVideo = VideoWriter('combinedvideo.avi'); 
outputVideo.FrameRate = 24; 
open(outputVideo); 

skip = 95; %first seconds 
j=skip*24; 
try 
while 1 
    front = read(vidObj_f,1+round(j*FrameRate_f*1/24)); 
    back = read(vidObj_b,1+round(j*FrameRate_b*1/24)); 
    front = imresize(front,[720 1280]); 
    videoframe = [front;back]; 
    writeVideo(outputVideo, videoframe); 
    j = j+1; 
end 
catch 
    disp('...end 1'); 
end 

vidObj_f = VideoReader('video3.mp4'); 
FrameRate_f = vidObj_f.FrameRate; 
vidObj_b = VideoReader('video4.mp4'); 
FrameRate_b = vidObj_b.FrameRate; 

skip = 0; %first seconds 
j=skip*24; 
try 
while 1 
    front = read(vidObj_f,1+round(j*FrameRate_f*1/24)); 
    back = read(vidObj_b,1+round(j*FrameRate_b*1/24)); 
    front = imresize(front,[720 1280]); 
    videoframe = [front;back]; 
    writeVideo(outputVideo, videoframe); 
    j = j+1; 
end 
catch 
    disp('...end 2'); 
end 

vidObj_f = VideoReader('video5.mp4'); 
FrameRate_f = vidObj_f.FrameRate; 
vidObj_b = VideoReader('video6.mp4'); 
FrameRate_b = vidObj_b.FrameRate; 

skip = 0; %first seconds 
j=skip*24; 
cut = 30; %after playing 'cut' seconds 
try 
while 1 
    front = read(vidObj_f,1+round(j*FrameRate_f*1/24)); 
    back = read(vidObj_b,1+round(j*FrameRate_b*1/24)); 
    front = imresize(front,[720 1280]); 
    videoframe = [front;back]; 
    writeVideo(outputVideo, videoframe); 
    if j>cut*24 
     disp('...end 3 (cut)'); 
     break 
    end 
    j = j+1; 

end 
catch 
    disp('...end 3'); 
end 

close(outputVideo); 
Смежные вопросы