Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

ビデオ ファイルの読み取り

この例では、特定の時間またはフレーム インデックスから開始してビデオのフレームを読み取る方法、指定の区間内のフレームを読み取る方法、およびビデオのすべてのフレームを読み取る方法を示します。

指定の時間またはフレーム インデックスで開始するフレームの読み取り

ファイルの先頭から 0.5 秒後にビデオ ファイルの一部の読み取りを開始します。次に、ビデオ ファイルのフレーム インデックス 100 から末尾までビデオを読み取ります。

サンプル ビデオ ファイル xylophone_video.mp4VideoReader オブジェクトを作成します。

vidObj = VideoReader("xylophone_video.mp4");

ファイルの先頭から 0.5 秒後に読み取りを開始するよう指定するには、CurrentTime プロパティを設定します。

vidObj.CurrentTime = 0.5;

readFrame メソッドを使用して、ファイルの末尾までビデオ フレームを読み取ります。

while hasFrame(vidObj)
    vidFrame = readFrame(vidObj);
    imshow(vidFrame)
    pause(1/vidObj.FrameRate)
end

Figure contains an axes object. The axes object contains an object of type image.

あるいは、read メソッドを使用して、指定のフレーム インデックスからビデオの末尾まで、ビデオからフレームを読み取ることもできます。読み取るインデックスを [100 Inf] と指定します。read メソッドによって、ビデオ ファイルの 100 から末尾までのフレームがすべて返されます。

vidframes = read(vidObj,[100 Inf]);

VideoReader オブジェクトをクリアします。

clear vidObj

指定した区間内のフレームの読み取り

時間またはフレームの区間を指定して、ビデオ ファイルの一部を読み取ります。

0.6 秒から 0.9 秒の間のビデオ フレームを読み取ります。最初に、VideoReader オブジェクトと、フレームを保持する構造体配列を作成します。

vidObj = VideoReader("xylophone_video.mp4");
s = struct("cdata",zeros(vidObj.Height,vidObj.Width,3,"uint8"),colormap=[]);

次に、CurrentTime プロパティを設定することで、ファイルの先頭から 0.6 秒後に読み取りを開始するよう指定します。

vidObj.CurrentTime = 0.6;

CurrentTime が 0.9 秒に達するまで 1 フレームずつ読み取ります。各ビデオ フレームからのデータを構造体配列に追加します。構造体配列内のフレーム数を表示します。s は 1 行 10 列の構造体配列であり、10 フレームが読み取られたことを示しています。構造体配列 s 内のフレームをムービーとして表示する詳細については、関数movieのリファレンス ページを参照してください。

k = 1;
while vidObj.CurrentTime <= 0.9
    s(k).cdata = readFrame(vidObj);
    k = k+1;
end
whos s
  Name      Size              Bytes  Class     Attributes

  s         1x10            2305344  struct              

あるいは、フレーム インデックスを使用して、指定した区間内のすべてのフレームを読み取ることができます。たとえば、読み取るフレームの範囲を [18 27] と指定します。read メソッドは、"m"×"n"×"p"×10 の配列を返します (各フレームのサイズは "m"×"n"×"p")。これは、10 フレームが読み取られたことを示します。

frames = read(vidObj,[18 27]);
whos frames
  Name          Size                    Bytes  Class    Attributes

  frames      240x320x3x10            2304000  uint8              

VideoReader オブジェクトをクリアします。

clear vidObj

すべてのフレームの読み取り

ビデオのすべてのフレームを 1 フレームごとに、またはすべてのフレームを一度に読み取ります。

VideoReader オブジェクトを作成して、ビデオ内のフレームの合計数を表示します。

vidObj = VideoReader("xylophone_video.mp4");
vidObj.NumFrames
ans = 141

readFrame メソッドを使用して、すべてのフレームを 1 フレームごとに読み取り、そのフレームを表示します。

while hasFrame(vidObj)
   frame = readFrame(vidObj);
   imshow(frame)
   pause(1/vidObj.FrameRate)
end

Figure contains an axes object. The axes object contains an object of type image.

あるいは、すべてのビデオ フレームを一度に読み取ることができます。read メソッドは、ビデオ フレームからなる "m"×"n"×"p"×141 の配列を返します (各フレームのサイズは "m"×"n"×"p")。

allFrames = read(vidObj);
whos allFrames
  Name             Size                      Bytes  Class    Attributes

  allFrames      240x320x3x141            32486400  uint8              

VideoReader オブジェクトをクリアします。

clear vidObj

ビデオ読み取りのトラブルシューティングとヒント

  • Windows® プラットフォームでは、ワークスペース内の VideoReader オブジェクトで参照されている AVI ファイルを変更または削除することはできません。VideoReader オブジェクトをワークスペースから削除するには、関数clearを使用します。

  • 一部の MP4 ファイルでは、NumFrames プロパティは、Windows、Mac、および Linux® の各プラットフォームで異なる値を返すことがあります。この違いは、基となるプラットフォーム固有の API の差異によるものです。

  • hasFrame メソッドは、CurrentTime プロパティの値が Duration プロパティの値と等しい場合に、logical 1 (true) を返すことがあります。この動作は、使用されている基盤となるプラットフォーム固有の API の制限によるものです。

  • CurrentTime プロパティを Duration 値に近い値に設定して、ビデオ ファイルの最後のフレームまで検索することは推奨されません。一部のファイルでは、この操作により、CurrentTime 値が Duration 値未満であっても、ファイルの終端に到達したことを示すエラーが返されます。この問題は通常、ファイルの期間がビデオ ストリームの期間より長く、ファイルの終端付近に読み取れるビデオがない場合に発生します。

  • ビデオ ファイルからのデータの読み取りを制限するために、Duration プロパティを使用することは推奨されません。hasFrame メソッドを使用して、読み取れるフレームがあるかどうかをチェックしてください。読み取れるフレームがなくなったことをファイルがレポートするまでデータを読み取るのが最善です。

  • Windows システムでのビデオ読み取りパフォーマンス: Windows で MP4 および MOV ファイルに対するビデオ リーダーのパフォーマンスを高めるために、MATLAB® ではシステムのグラフィックス ハードウェアをデコードに使用します。ただし、システムの特定のグラフィックス ハードウェアによっては、デコードにグラフィックス カードを使用した場合、パフォーマンスが低下することがあります。システムでのビデオ リーダーのパフォーマンス低下に気づいた場合は、matlab.video.read.UseHardwareAcceleration('off') と入力してハードウェア アクセラレーションをオフにしてください。ハードウェア アクセラレーションは、matlab.video.read.UseHardwareAcceleration('on') と入力することで再度有効にできます。

参考

| | | |

関連するトピック