ストリームから画像を取得しようとしています (より正確には MemoryStream )。問題を解決できる Microsoft の製品が見つかりません。SQL からストリームを取得しているので、そこから画像を取得する方法があれば問題ありません。ffmpeg を確認しましたが、問題はビデオ ファイルを保存する必要があることです。ファイルは最大 2GB に達する可能性があり、ディスクに書き込まない方法があれば役立ちます。最初の 10MB またはその他の制限されたサイズのみを読み取り、そこからイメージを読み取る方法があれば、それも解決策になる可能性があります。
2 に答える
ビデオ フィードは、圧縮されていない未加工のビデオ フレームと、.MP4 ファイルなどのより複雑な多重化されたファイル形式と互換性のあるデータのチャンクを並べたような単純な場合があります。前者の場合は非常に単純かもしれませんが、後者の場合は、ファイルを逆多重化し、ストリーム内をシークし、デコードを開始し、場合によっては数フレームをスキップしてから、目的のフレームを取得する必要があります。要点は、見かけほど単純ではないかもしれないということです。
Windows のビデオ処理 API は、DirectShow、Media Foundation です。DirectShow を使用すると、SQL でサポートされたデータ ストリームの上にカスタム データ ソースを作成し、そこから DB データをオンデマンドで取得し、残りのタスクを実行するために API インターフェイス コンポーネント (ストックおよびサード パーティ) を使用することができます。
実際には FFMpeg ツールのラッパーである無料の VideoConverter for .NETを使用してフレームをキャプチャすることができます。アイデアは、VideoConverter の (C# ストリームへの) ライブ ストリーミング機能を、実際には C# プログラムで処理できるビットマップ ストリームである特別な FFMpeg 形式の「rawvideo」に使用することです。
var videoConv = new FFMpegConverter();
var ffMpegTask = videoConv.ConvertLiveMedia(
"input.mp4",
null, // autodetect live stream format
rawBmpOutputStream, // this is your special stream that will capture bitmaps
"rawvideo",
new ConvertSettings() {
VideoFrameSize = "320x200", // lets resize to exact frame size
CustomOutputArgs = " -pix_fmt bgr24 ", // windows bitmap pixel format
VideoFrameRate = 5, // lets consume 5 frames per second
MaxDuration = 5 // lets consume live stream for first 5 seconds
});
VideoConverter は、別の .NET ストリームからライブ ストリームを読み取ることができます (入力形式をライブ ストリーム変換で使用できる場合)。