c++ - 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
.
谢谢你 。
解决方案
推荐阅读
- android - Android Tv Companionlibrary 导致重复类
- c# - 在将模型保存到数据库之前,在 asp.net core 中加密模式中的特定字段
- reactjs - 如何使用 testing-react-library 测试具有切换功能的隐藏文本?
- ansible - 如何在ansible中用“-”分隔单词
- php - 仅通过 FTP 从 FTP 服务器获取当前日期的文件
- javascript - 如何检查四个数组的长度是否相同?角打字稿
- google-maps - 在 React-Native-Maps 中:您可以更新特定的标记而不必重新渲染所有标记吗?
- aws-lambda - EventBridge 与 API 网关
- javascript - 使用 JavaScript 向元素添加内容样式
- for-loop - Julia中N xd矩阵的通用嵌套for循环