複数個の動画ファイルを1つに結合することはできますか?
20 views (last 30 days)
Show older comments
「.mp4」または「.avi」形式で保存された、動画ファイルが100個あります。
動画を縦横方向に(一例5×20)に結合して新たに1つの動画ファイルを作成し、保存することは可能でしょうか。
使用する動画を添付することができませんでした。使用したいファイルの名前は「test01」、「test02」...「test100」です。
フォルダを指定して、ワークスペースに展開した後、何らかの処理があると考えられるのですが、動画をどう取り扱うべきか分からず、こちらでご質問させていただきました。ファイルを数値変数として結合する必要があるのか、何らか動画形式で結合する手段があるのか、ご教示いただけないでしょうか。なお、フォーマット、フレームレート等の動画形式は、全て同じです。
ご確認を、どうぞよろしくお願いいたします。
2 Comments
Accepted Answer
Kojiro Saito
on 6 Feb 2024
Edited: Kojiro Saito
on 7 Feb 2024
動画の数だけVideoReaderを作り、フレーム毎にreadFrameで画像を取得してhorzcatで横向きに結合、vertcatで縦向きに結合し、VideoWriterで1つの動画に出力する方法で実現できます。
あまりきれいなコードではないですが、サンプルを書きます。
% 出力先の1つの動画をVideoWriterで作成
vw = VideoWriter("videoMerge.avi");
open(vw)
% 元の100個の動画のVideoReaderを作成
myVideo = cell(100, 1);
for n=1:100
myVideo{n} = VideoReader(sprintf("test%02d.avi", n));
end
% 動画ごとのフレーム画像を事前に定義
myFrame = cell(100, 1);
while hasFrame(myVideo{1})
imM = [];
for n=1:100
% 動画ごとのフレーム画像を格納
myFrame{n} = readFrame(myVideo{n});
end
% 5行✕20列の結合した動画を作成する
for n=1:20:81
tempImM = [];
for m=0:19
% 横向きに画像を結合
tempImM = horzcat(tempImM, myFrame{n+m});
end
% 縦向きに画像を結合
imM = vertcat(imM, tempImM);
end
% 結合したフレームを動画に出力
writeVideo(vw, imM)
end
% VideoWriterとVideoReaderを消去
close(vw)
clear myVideo
※最初の回答では20行✕5列の動画になってしまっていたので5行✕20列の動画になるように修正しました。
2 Comments
More Answers (1)
Atsushi Ueno
on 11 Feb 2024
すでに解決済みですが...
”MATLABでfor文使ったら負け”教の信者として、どうしてもfor文を削除したかったんです。
% 元の100個の動画のVideoReaderを作成
path = uigetdir(pwd,'動画のあるフォルダを選択');
fds = fileDatastore(path,'ReadFcn',@(fn) VideoReader(fn));
myVideo = readall(fds);
% 出力先の1つの動画をVideoWriterで作成
vw = VideoWriter('videoMerge.avi');
open(vw)
while hasFrame(myVideo{1})
% 動画ごとのフレーム画像を格納
myFrame = cellfun(@readFrame, myVideo, 'UniformOutput', false);
% 5行✕20列の結合した動画を作成する
imM = cell2mat(reshape(myFrame, 5, 20));
% 結合したフレームを動画に出力
writeVideo(vw, imM)
end
% VideoWriterとVideoReaderを消去
close(vw)
clear myVideo
3 Comments
Atsushi Ueno
on 12 Feb 2024
🤔 mmm... 'xylophone.mp4' を並べて動作確認してたので、重要な事に気付きませんでした。
しかしながら、個々の課題は下記の方法で解消できます。
- ファイル名の並び:ご提案の compose 関数や有志による natsortfiles 関数でOK(類似質問)
- 並べる方向の変更:reshape(myFrame, 5, 20)⇒reshape(myFrame, 20, 5)' でOK
- for文の方が読み易い:むしろ信者は for 文の無い方が読み易いと考えます(続く)
(続き)これは正に「MATLABで for 文使ったら負け教」のメインテーマ「MATLABを布教し、MATLABのあらゆる機能に通じたMATLABネイティブ信者を増やす」事につながるのです。下記は我々が日々の修行で連呼している決意文です。
See Also
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!