質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

FFmpeg

FFmpegは、動画と音声を交換できるフリーソフトウェアです。UNIX系OSから派生した、MS-DOSから操作するコマンドラインツールです。libavcodecやlibavformat、libswscale、libavfilterなどを含みます。ライセンスは、コンパイルの際のオプションによりLGPLもしくはGPLに決定されます。対応コーデックや使用できるオプションが多く、幅広く利用されています。

Q&A

解決済

1回答

3758閲覧

C++で,mp4の指定フレームをRAWデータとして取り出したい。

vsmorse

総合スコア68

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

FFmpeg

FFmpegは、動画と音声を交換できるフリーソフトウェアです。UNIX系OSから派生した、MS-DOSから操作するコマンドラインツールです。libavcodecやlibavformat、libswscale、libavfilterなどを含みます。ライセンスは、コンパイルの際のオプションによりLGPLもしくはGPLに決定されます。対応コーデックや使用できるオプションが多く、幅広く利用されています。

0グッド

0クリップ

投稿2020/05/29 08:29

編集2020/05/29 10:07

###実現したいこと
題のとおりです。
.mp4の指定フレームの画像を、RAWデータとして取り出したいです。
当方は簡易動画編集ソフトのようなものを開発しており、.mp4の動画データを読み込みたいです。
そのため、つながったRAWデータをリアルタイム再生できる程度の速さもほしいです。
###困っている点
Googleなどで検索し、いくつかの方針を立てたのですが、どれを採用したものか、あまりに一般的でない方法が混じってないか、もしくは知らない、いい方法が無いかなどをご教授いただきたいです。
####建てた方針

  • mp4を予め連番pngに変換する。(png -> RAW は既に完成しています)

長い動画を扱う際、保存容量が増大してしまう。
FFmpegを使って試してみたところ、時間も結構かかるように感じました

  • mp4をAVIに予め変換し、AVIの指定フレームを切り出しRAWデータを得る

これも無圧縮AVIを扱う時に容量が増大してしまうのでは?と懸念があります。
AVIの指定フレームを切り出しRAWデータを得る方法も、現状では分かっていません。

  • 逐一欲しいフレームを(FFmpegなどで)pngに書き出し、png->RAW

容量も少なくて済むのですが、工程が多く、二度手間・一般的でない方法に直感で感じるのと、
リアルタイムで再生するには速度が追いつかないです。

その結果、容量と速度の両立が難しく、一般的な動画編集ソフトはどんな方法を採用しているのか?など、気になった次第です。

何しろ映像編集の分野について初心者なので、他に必要な情報があれば教えていただきたいです。

###補足情報(言語/FW/ツール等のバージョンなど)
Windows10 Home/64Bit
VS Community 2019
C++ 17

###追加情報 - 「RAWデータ」をどのような意味で使っていたか
ここでは、「非圧縮の画像データ」と考えて書いています。
具体的には、
[R,G,B,A,R,G,B,A ....]のように、
左上のピクセルから、x,y座標のR,G,B,Aを
(1,1) (2,1) (3,1) .... (1,2) (2,2) (3,2) ....
のように並べて格納しています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yohhoy

2020/05/29 09:46

「RAWデータ」=非圧縮の(例えばRGB形式の)フレーム映像 を指していますか? 一般に、動画編集ソフトは動画データ=「RGB形式映像フレームが連続したデータ列」として取り扱います。
vsmorse

2020/05/29 09:52

非圧縮です!映像ではなく、画像(フレーム)です。具体的には [R,G,B,A,R,G,B,A,R,G,B,A...]のように、一枚の画像を左上のピクセルからRGBAデータを順に並べたような配列の構造として私の作ったプログラムでは扱っております。同様の内容を質問にも編集しておきます。
SHOMI

2020/05/30 04:53

> つながったRAWデータをリアルタイム再生できる程度の速さもほしいです。 元のMP4があるのになぜ画像を表示しようとしているのでしょうか。 > 一般的な動画編集ソフトはどんな方法 Iフレームについてはサムネイル用に事前デコードして持っているかもしれませんが、 あとのフレームは随時デコードでは?
vsmorse

2020/05/30 04:58

mp4をただ再生するだけでなく、1フレームづつ加工をしたような映像を作りたくて、mp4がエンコードされた状態のまま加工するのは難しいんじゃないか?mp4を一旦非圧縮のフレームごとにバラバラの画像を作って、それに加工を施してから、もう一度mp4にエンコードするのではないか?と思った次第です。
SHOMI

2020/05/30 05:03

>リアルタイムで再生するには速度が追いつかないです。 とはどこのことをいわれているのですか? 複数の話をごちゃまぜにされているような…
SHOMI

2020/05/30 05:04

FFmpegを使用していちいちPNGに変換して読みださなくとも、DirectShowやMediaFoundationでデコードしたフレームの画像が得られます。
vsmorse

2020/05/30 05:09 編集

そうなのですか!それは非圧縮のデータ(追加情報のところに書いてあるような)形式で得ることもできるのですか...?
vsmorse

2020/05/30 05:11

どちらにせよ,DirectShowやMediaFoundation,の存在・それでデコードできることを知らなかったです。言葉足らずで申し訳なかったのですが、 > DirectShowやMediaFoundationでデコードしたフレームの画像が得られます というのが、求めていた回答になります。ありがとうございます。
vsmorse

2020/05/30 05:17

あ、こういうことがしたかったです!ちなみに、MediaFoundationはDirectShowの後継という情報を調べる中で見つけたのですが、MediaFoundationは管理クラスが必要?で複雑、という情報を見つけました。今、どちらを使うのが吉か教えて戴けないでしょうか...
SHOMI

2020/05/30 07:51 編集

XP以前もサポートするならDirectShow一択。XP以前をサポートしなくてもよいならどちらでもお好きな方を。DirectShowにはオーバーレイ周りで何か制限があったようなおぼえがありますが、最後に触ったのがVistaの頃なので記憶が…
vsmorse

2020/05/30 05:28

なるほど。実行環境の想定としてはWindows7以上としているので、提示していただいたDirectShowの方から勉強を始めてみようと思います。 解決として、閉じさせていただきます。ありがとうございました!
SHOMI

2020/05/30 05:33 編集

素の環境だとffdshowなどで別途H.264のデコーダーやMP4のソースフィルタをインストールしないといけないかもしれません。
vsmorse

2020/05/30 05:35

ありがとうございます!
guest

回答1

0

自己解決

SHOMIさんに、「質問への追記・修正の依頼」のところで答えを教えていただいたので、解決とさせていただきます。
要約いたしますと、FFmpegなどをわざわざ使わずともDirectShowやMediaFoundationなるものが存在していて、
デコードすることが可能なようです。
とりあえずその方向で進めてみようと思っています。
本当にありがとうございました!

投稿2020/05/30 05:31

vsmorse

総合スコア68

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問