注: 本人非常清楚這項任務使用pr會簡單很多,此篇文章只是為了探究matlab能干啥的邊界,并作為一個熟悉matlab矩陣操作和視頻音頻操作的例子,
效果如下:
(怕侵權就只放個動圖)
可以看到小姐姐的舞蹈非常讓人上頭哈!!!!

材料準備:
1首先需要準備一個小姐姐的視頻:
(完整素材包放在文章最后)

2需要準備一系列小姐姐跳舞的png圖片,放在pic檔案夾里:

完整代碼:
其實原理很簡單,就只是計算圖片應該到的位置,把圖片放到該放的地方,至于怎么樣讓聲音和視頻和在一起可以看這一篇:
MATLAB 如何將視頻和音頻寫入同一個檔案?以視頻上下顛倒為例,附帶詳細注釋
function moveAddWaitBar2
videoPath='test.mp4';
picPath='.\pic\';%圖片素材路徑
movObj=VideoReader(videoPath);
[AUDIO,Fs]=audioread(videoPath);
audioLen=round(size(AUDIO,1)./movObj.NumFrames);
videoFWriter=vision.VideoFileWriter('result.avi','FrameRate',movObj.FrameRate);
videoFWriter.AudioInputPort=true;
files=dir(fullfile(picPath,'*.png')); %圖片格式png
picNum=size(files,1);
% 匯入圖片素材
for i=1:picNum
fileName=strcat(picPath,files(i).name);
[img,~,alp]=imread(fileName);
imgSet{i}=img;
alpSet{i}=alp;
end
close all;
fig=figure(1);
fig.NumberTitle='off';
[m,n,~]=size(read(movObj,1));
for k=1:movObj.NumFrames
frame=read(movObj,k);
tImg=imgSet{mod(k-1,picNum)+1};
tAlp=alpSet{mod(k-1,picNum)+1};
[M,N,~]=size(tImg);
% 動圖定位
tN=round(k/movObj.NumFrames*n);
tNSet=tN+1-floor(N/2):tN+ceil(N/2);
if any(tNSet<=0)
tNSet(tNSet<=0)=[];
tNSet2=tNSet+N-tNSet(end);
else
tNSet(tNSet>n)=[];
tNSet2=tNSet-tNSet(1)+1;
end
% 動影像素寫入每一幀影像
tPart=frame(end-M+1:end,tNSet,:);
tPart2=tImg(:,tNSet2,:);
tPart3=tAlp(:,tNSet2);
tPart_R=tPart(:,:,1);
tPart_G=tPart(:,:,2);
tPart_B=tPart(:,:,3);
tPart2_R=tPart2(:,:,1);
tPart2_G=tPart2(:,:,2);
tPart2_B=tPart2(:,:,3);
tPart_R(tPart3~=0)=tPart2_R(tPart3~=0);
tPart_G(tPart3~=0)=tPart2_G(tPart3~=0);
tPart_B(tPart3~=0)=tPart2_B(tPart3~=0);
tPart(:,:,1)=tPart_R;
tPart(:,:,2)=tPart_G;
tPart(:,:,3)=tPart_B;
changeFrame=frame;
changeFrame(end-M+1:end,tNSet,:)=tPart;
changeFrame=uint8(changeFrame);
% 音頻視頻寫入
videoFWriter(changeFrame,AUDIO((k-1)*audioLen+1:k*audioLen,:));
imshow(changeFrame)
fig.Name=['Frame:[',num2str(k),'/',num2str(movObj.NumFrames),']'];
end
release(videoFWriter);
end
完整素材包:
鏈接:https://pan.baidu.com/s/1l5eCW-el4CR_R8worvaP-w
提取碼:t9xe
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/297399.html
標籤:其他
