NAudio でオーディオを再生するアプリケーションがあります。NAudio の既知の制限は、ガベージ コレクターが実行されるたびに、実行が完了するまですべてのスレッドが一時停止されることです。
アプリケーションは正常に動作し、すべての GC は許容時間内に完了し、スタッターはありません。
しかし、TCP を介してメイン アプリケーション (オーディオ プレーヤーを含む) にサムネイルを毎秒送信する別のアプリケーションもあります。サムネイルは JPEG でエンコードした場合、約 1300 バイトです。
これは、画像をデコードするために現在使用しているコードです。
MemoryStream ms = new MemoryStream(data);
BitmapDecoder bdec = BitmapDecoder.Create(ms, BitmapCreateOptions.None, BitmapCacheOption.Default);
BitmapSource source = bdec.Frames[0];
imgPreview.Source = source;
そしてエンコードするには:
JpegBitmapEncoder jpgEncoder = new JpegBitmapEncoder();
jpgEncoder.QualityLevel = quality;
jpgEncoder.Frames.Add(BitmapFrame.Create(renderTarget));
byte[] imageArray;
using (MemoryStream outputStream = new MemoryStream())
{
jpgEncoder.Save(outputStream);
imageArray = outputStream.ToArray();
}
RenderTarget は、画像コンテンツを持つ RenderTargetBitmap です。
現在、毎秒 MemoryStream、BitmapDecoder、および BitmapSource を作成して破棄しています。コードから行をコメントアウトしましたが、MemoryStream と BitmapDecoder コンストラクターはスタッターを作成していないように見えますが、Frames[0] を介してアクセスすると、スタッターが始まります。
BitmapDecoder の代わりにこのアプローチも試しましたが、同じ結果になりました。
img.BeginInit();
img.StreamSource = ms;
img.EndInit();
画像を継続的に更新するためのより良い方法はありますか?
最良の方法は、生の画像データを送信して、毎秒書き換えられる WriteableBitmap を作成することです。しかし、生の画像は 170 kb で、エンコードされた画像の 100 倍以上あります。JPEG ストリームを既存のバイト配列または既存の画像にデコードすることは可能ですか?