複数個の動画ファイルを1つに結合することはできますか?
29 Ansichten (letzte 30 Tage)
Ältere Kommentare anzeigen
non
am 5 Feb. 2024
Kommentiert: Atsushi Ueno
am 16 Feb. 2024
「.mp4」または「.avi」形式で保存された、動画ファイルが100個あります。
動画を縦横方向に(一例5×20)に結合して新たに1つの動画ファイルを作成し、保存することは可能でしょうか。
使用する動画を添付することができませんでした。使用したいファイルの名前は「test01」、「test02」...「test100」です。
フォルダを指定して、ワークスペースに展開した後、何らかの処理があると考えられるのですが、動画をどう取り扱うべきか分からず、こちらでご質問させていただきました。ファイルを数値変数として結合する必要があるのか、何らか動画形式で結合する手段があるのか、ご教示いただけないでしょうか。なお、フォーマット、フレームレート等の動画形式は、全て同じです。
ご確認を、どうぞよろしくお願いいたします。
2 Kommentare
Akzeptierte Antwort
Kojiro Saito
am 6 Feb. 2024
Bearbeitet: Kojiro Saito
am 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 Kommentare
Weitere Antworten (1)
Atsushi Ueno
am 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 Kommentare
Atsushi Ueno
am 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ネイティブ信者を増やす」事につながるのです。下記は我々が日々の修行で連呼している決意文です。
Siehe auch
Kategorien
Mehr zu Image Processing and Computer Vision finden Sie in Help Center und File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!