【问题标题】:Streaming a webm video from a URL into a C++ windows.h application将 webm 视频从 URL 流式传输到 C++ windows.h 应用程序
【发布时间】:2019-11-28 14:35:30
【问题描述】:

我正在使用 C++ 制作我自己的 Windows 应用程序。我想在此应用程序中播放一个 .webm 视频,但我想从 URL 播放它,而不是从我放入 .exe 的同一目录中加载它。我是运行 Windows 10,只使用 Emacs 和 g++ 编写/编译。

有谁知道我如何做到这一点?我需要什么,是否可能等等?

注意:webm 视频也可以转成 mp4。

为了澄清,“Windows 应用程序”是指以下之一:

HWND hwnd = CreateWindowEx(0, CLASS_NAME, L"WindowName", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,  CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL);

我想继续使用它,因为我可以用它制作一个漂亮的无边框窗口!

【问题讨论】:

    标签: c++ windows winapi


    【解决方案1】:

    这个sample使用了IMFPMediaPlayer::CreateMediaItemFromURL,可以直接将URL传递给函数PlayMediaFile,比如:

    WCHAR uri[] = L"http://dl5.webmfiles.org/big-buck-bunny_trailer.webm";
    hr = PlayMediaFile(hwnd, uri);
    

    【讨论】:

    • 这有帮助吗?如果有任何问题,请随时与我联系。
    【解决方案2】:

    将 gstreamer 与 uridecodebin 一起使用(您需要设置 uri 属性)。可能需要在 src 和 sink 之间添加额外的 autovideoconvert 和/或 videoscale 元素。

    GstElement *pipeline = gst_pipeline_new ("xvoverlay");
    GstElement *src = gst_element_factory_make ("uridecodebin", NULL);
    GstElement *sink = gst_element_factory_make ("d3dvideosink", NULL);
    
    g_object_set (G_OBJECT (src), "uri","some_url", NULL);
    
    gst_bin_add_many (GST_BIN (pipeline), src, sink, NULL);
    gst_element_link (src, sink);
    gst_video_overlay_set_window_handle (GST_VIDEO_OVERLAY (sink), (guintptr)hwnd);
    GstStateChangeReturn sret = gst_element_set_state (pipeline,
      GST_STATE_PLAYING);
    

    如果您安装了 gstreamer,请使用以下命令测试您的设置:

    gst-launch-1.0 uridecodebin uri="http://dl5.webmfiles.org/big-buck-bunny_trailer.webm" ! d3dvideosink
    

    【讨论】:

    • 我已经下载了 gstreamer,但我不确定要包含什么或文件在哪里,或者是否需要将其放入 $PATH 中。我也不确定我会把这段代码放在哪里。就在 WndProc 中?
    • @Schmleh 你可以使用我在这里创建的示例github.com/bialasjaroslaw/gstreamer_overlay
    猜你喜欢
    • 1970-01-01
    • 2012-07-20
    • 1970-01-01
    • 2016-11-14
    • 1970-01-01
    • 2013-11-30
    • 2018-01-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多