首页 > 解决方案 > winrt::Windows::Media::Playback::MediaPlayer 在调用 CopyFrameToVideoSurface 时导致崩溃

问题描述

我想使用 C++/WinRT API 从我在 C++ 控制台应用程序中播放的视频中提取原始帧或位图。我只是CopyFrameToVideoSurface用来将视频的帧复制到IDirect3DSurface. 但是,它只会使我的程序崩溃(如果我不设置此帧提取回调,它可以正常工作)。我的目标是在其他地方渲染这个帧缓冲区来显示视频。

帧提取代码 (参见此处的完整项目:https ://github.com/harmonoid/libwinmedia/tree/stackoverflow )

IDirect3DSurface surface = IDirect3DSurface();
Streams::IBuffer buffer = Streams::IBuffer();


DLLEXPORT void PlayerSetFrameEventHandler(
    int32_t player_id, void (*callback)(uint8_t* buffer, int32_t size,
                                        int32_t width, int32_t height)) {
  g_media_players.at(player_id).IsVideoFrameServerEnabled(true);
  g_media_players.at(player_id)
      .VideoFrameAvailable([=](auto, const auto& args) -> void {
        g_media_players.at(player_id).CopyFrameToVideoSurface(surface);
        SoftwareBitmap bitmap =
            SoftwareBitmap::CreateCopyFromSurfaceAsync(surface).get();
        bitmap.CopyToBuffer(buffer);
        (*callback)(buffer.data(), buffer.Length(), bitmap.PixelWidth(),
                    bitmap.PixelHeight());
      });
}

您可以使用简单地构建这个共享库cmake --build .

为了测试崩溃,您可以编译以下示例(也存在于链接仓库中): https ://github.com/harmonoid/libwinmedia/blob/stackoverflow/examples/frame_extractor.cpp

#include <cstdio>
#include "../include/internal.hpp"
int32_t main() {
  using namespace Internal;
  // Create a list of medias.
  const char* media_uris[] = {
      "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/"
      "ForBiggerJoyrides.mp4"};
  const int media_ids[] = {0};
  // Create a player instance.
  PlayerCreate(0);
  // Set frame callback (comment out the code to prevent crash from happening).
  PlayerSetFrameEventHandler(
      0, [](uint8_t*, int32_t, int32_t width, int32_t height) {
        printf("Video width: %d, Video height: %d.", width, height);
      });
  // Open list of medias.
  PlayerOpen(0, 1, media_uris, media_ids);
  // Start playing the player.
  PlayerPlay(0);
  // Prevent console from closing.
  getchar();
  return 0;
}

如果我能得到帮助来修复代码或任何其他使用winrt::Windows::Media::Playback::MediaPlayer.

谢谢你 。

以下是崩溃的堆栈跟踪: 碰撞

标签: c++windowsuwpwindows-runtimec++-winrt

解决方案


推荐阅读