2017-05-22 39 views
1

Windows UWPでSoftwareBitmapをBgra8からJPEGに変換する方法。 GetPreviewFrameAsync関数は、Bgra8でvideoFrameデータを取得するために使用されます。次のコードで何がうまくいかないのですか? jpegサイズが0になっています。Windows UWPでBgra8からSoftwareBitmapをJPEGに変換する方法

auto previewProperties = static_cast<MediaProperties::VideoEncodingProperties^> 
     (mediaCapture->VideoDeviceController->GetMediaStreamProperties(Capture::MediaStreamType::VideoPreview)); 
    unsigned int videoFrameWidth = previewProperties->Width; 
    unsigned int videoFrameHeight = previewProperties->Height; 
    FN_TRACE("%s videoFrameWidth %d videoFrameHeight %d\n", 
     __func__, videoFrameWidth, videoFrameHeight); 

    // Create the video frame to request a SoftwareBitmap preview frame 
    auto videoFrame = ref new VideoFrame(BitmapPixelFormat::Bgra8, videoFrameWidth, videoFrameHeight); 

    // Capture the preview frames 
    return create_task(mediaCapture->GetPreviewFrameAsync(videoFrame)) 
     .then([this](VideoFrame^ currentFrame) 
    { 
     // Collect the resulting frame 
     auto previewFrame = currentFrame->SoftwareBitmap; 

     auto inputStream = ref new Streams::InMemoryRandomAccessStream(); 

     create_task(BitmapEncoder::CreateAsync(BitmapEncoder::JpegEncoderId, inputStream)) 
      .then([this, previewFrame, inputStream](BitmapEncoder^ encoder) 
     { 
      encoder->SetSoftwareBitmap(previewFrame); 
      encoder->FlushAsync(); 

      FN_TRACE("jpeg size %d\n", inputStream->Size); 
      Streams::Buffer^ data = ref new Streams::Buffer(inputStream->Size); 
      create_task(inputStream->ReadAsync(data, (unsigned int)inputStream->Size, InputStreamOptions::None)); 
     }); 
}); 

答えて

0

Bitmap​Encoder.FlushAsync()のメソッドは非同期メソッドです。次のように使用する必要があります。

// Capture the preview frames 
return create_task(mediaCapture->GetPreviewFrameAsync(videoFrame)) 
    .then([this](VideoFrame^ currentFrame) 
{ 
    // Collect the resulting frame 
    auto previewFrame = currentFrame->SoftwareBitmap; 

    auto inputStream = ref new Streams::InMemoryRandomAccessStream(); 

    return create_task(BitmapEncoder::CreateAsync(BitmapEncoder::JpegEncoderId, inputStream)) 
     .then([this, previewFrame](BitmapEncoder^ encoder) 
    { 
     encoder->SetSoftwareBitmap(previewFrame); 
     return encoder->FlushAsync(); 
    }).then([this, inputStream]() 
    { 

     FN_TRACE("jpeg size %d\n", inputStream->Size); 
     //TODO 
    }); 
}); 

次に正しいサイズを取得できるはずです。詳細はAsynchronous programming in C++をご覧ください。

関連する問題