2017-03-10 4 views
0

私はビデオシーケンス(フォーマットY4M)を持っており、同じGoPサイズのセブラルセグメントに分割したいと思います。 GoP = 8; FFMPEGを使ってMatLabでどうすればいいですか?非圧縮ビデオをMatLab上でffmpegのセグメントに分割しますか?

+0

すべてのセグメントを8フレームにしたいのですか?申し訳ありませんが、私はあなたの専門用語に精通していません。 – Cecilia

+0

はい、正確に@セシリアです。 – SenDjasni

+0

FFMPEGを使用する特別な理由は何ですか? Matlabにはビデオを読み込んで処理するための他のメソッドがあります。 – Cecilia

答えて

1

Matlabでビデオを表現する標準的な方法の1つは、4Dマトリックスです。寸法は高さx幅xカラーチャネルxフレームです。行列を作成したら、好きなフレームの範囲を指定することでタイムスライスを取るのは簡単です。

たとえば、ビデオを表現するためのループ

%Loads video as 4D matrix 
v = VideoReader('xylophone.mp4'); 
while hasFrame(v) 
    video = cat(4, video, readFrame(v)); 
end 

%iterate over the length of the movie with step size of 8 
for i=1:8:size(video, 4)-8 
    video_slice = video(:,:,:,i:i+7); %get the next 8 frames 

    % do something with the 8 frames here 

    % each frame is a slice across the 4th dimension 
    frame1 = video_slice(:,:,:,1); 
end 

%play movie 
implay(video) 

他の最も一般的な方法で一度に8つのフレーム構造アレイ内でつかむことができます。ある範囲の値を持つ構造体配列にインデックスを付けて、8つのフレームをスライスすることができます。私の例の実際のフレーム値は、構造要素cdataに格納されています。構造に応じて、要素の名前は異なる場合があります。 3d行列値を持つ要素を探します。

% Loads video as structure 
load mri 
video = immovie(D,map); 
%iterate over the length of the movie with step size of 8 
for i=1:8:size(video, 4)-8 
    video_slice = video(i:i+7); %get the next 8 frames 

    % do something with the 8 frames here 

    % to access the frame values use cdata 
    frame1 = video_slice(1).cdata 
end 

%play movie 
implay(video) 

トリッキーな部分はあなたのビデオフォーマットです。 Y4MはMatlabのビデオをロードする最も一般的な方法であるVideoReaderによってサポートされていません。また、いくつかのメディアフォーマット(MP3、AAC、mpeg4、x264、アニメーションGIF)を提供するFFmpeg Toolboxではサポートされていません。

  1. how to read y4m video(get the frames) file in matlab
  2. How to read yuv videos in matlab?

含め、この問題に対する解決策を探し夫婦他の質問は、私もthe Matlab File Exchangeにチェックだろうが、私は個人的な経験を持っていないがありますこれらの方法のいずれかを用いる。

+0

私はそれを試して、それが主要な問題を解決するかどうかを見ます。ありがとう@cecilia – SenDjasni

+0

別の質問ID私は、なぜ4D行列ですか? – SenDjasni

+0

Matlabは行列の周囲に構築されているので、ビデオの要素(ピクセル)は均質で密であり、数値で表されるので、行列は当然のように見えます。 – Cecilia

関連する問題