直接从C ++应用程序

时间:2015-04-28 22:51:37

标签: c++ qt canvas opengl-es webgl

我一直在尝试使用Qt Webkit在浏览器中呈现视频元素。我的所有帧都由C ++应用程序解码(通过网络接收的源视频数据包),我可以使用Qt在元素中显示视频,如下所述:QtWebEngine rendering native Qt widgets in DOM?但我受到z-index问题的限制Qt Webkit :(

相反,我想知道以下任何一种情况是否可能,以及是否有人在此之前取得了任何成就。

我有一个C ++应用程序,可以启动Chrome嵌入式框架窗口(基本上是一个浏览器窗口)。我的C ++应用程序有没有办法直接将视频呈现到浏览器窗口 - 使用webGL或类似的库?也许有一些方法我可以在C ++应用程序中使用openGL写入显卡内存并让webGL读取显卡数据 - 如果存在这样的技术,这将是非常棒的但我担心沙盒不会允许这样做。

e.g。

Browser webGL surface/object <--- C++ application <--- file/network data

(非常!)天真的方法是浏览器窗口使用环回地址上的websocket连接到C ++核心应用程序,websocket将表面流式传输到浏览器。然后可以将这些表面绘制到html5画布或由webGL使用 - 但这在延迟方面可能会很糟糕。

e.g

Browser <--- websocket <--- C++ decode <--- file/network data

非常感谢 - 对于此代码示例我可以使用的替代库的任何其他建议将非常感激:)

3 个答案:

答案 0 :(得分:0)

我建议CEF: https://en.wikipedia.org/wiki/Chromium_Embedded_Framework 它完全支持现代Google Chrome浏览器可以执行的任何操作。实际上,它是Chrome浏览器。

答案 1 :(得分:0)

...在浏览器中呈现视频元素。我所有的帧都被解码 C ++应用程序(通过网络接收的源视频包), 我可以在一个元素中显示视频...

也许,我们不清楚该任务,但是您尝试从stream读取HTML(您有两个主要模块:C ++作为视频转换器,HTML / WebGL作为视频输出-在这里,我放弃了将视频传输到HTML的障碍。

首先,从HTML开始。要在浏览器中显示视频,您需要:

<video width="320" height="240" autoplay>
  <source src="http://localhost/movie.ogg" type="video/ogg">
  Your browser does not support the video tag.
</video>

第二,您需要一个流源。它可以像您一样使用C ++程序,但原始的Question却说:“源网络上收到的视频数据包”。这意味着您已经拥有某种格式的流。您只需要将其转换为ogg。最好的解决方案是ffmpeg

如果您的C ++程序已经可以生成某种格式的流(例如,ogg),那么对您来说问题就不那么大了。

答案 2 :(得分:0)

也许这对您来说是个好选择。

将c ++ / c代码端口写入->到html / js

https://emscripten.org/docs/getting_started/index.html

我从python emsdk脚本获取用于编译args的数据。 这里有一些有趣的示例,例如SDL,GL,键盘,鼠标事件。


C GL Shader:

  emcc sdl2-c-shader/sdl2glshader.c -s USE_SDL=2
           -s LEGACY_GL_EMULATION=1 -s GL_UNSAFE_OPTS=0
           -o sdl2-c-shader/build/sdl2.html

Mouse events:

  emcc mouse-events/test_html5_mouse.c -O2 -g1 --closure 1
  -s DISABLE_DEPRECATED_FIND_EVENT_TARGET_BEHAVIOR=1
  -DAUTOMATE_SUCCESS=1  -o mouse-events/build/tmouse.html

Draw object, declare in typescript, opengles2

  emcc sdl-ts-declare/webgl_draw_triangle.c -lGL
  -s OFFSCREEN_FRAMEBUFFER=1 -DEXPLICIT_SWAP=1
  -DDRAW_FROM_CLIENT_MEMORY=1 -s FULL_ES2=1
  -o sdl-ts-declare/build/gles2test.html

Keyboard (c)

  emcc keyboard-c/test_keyboard_codes.c -O2 -g1 --closure 1
  -s DISABLE_DEPRECATED_FIND_EVENT_TARGET_BEHAVIOR=1
  -DAUTOMATE_SUCCESS=1  -o keyboard-c/build/keyboard-mouse.html

Write file (cpp)

  emcc write-file/write_file.cpp -s ENVIRONMENT=web
  --closure 1 -o write-file/build/test.html

Draw trianlge object, (c, opengles2)

  emcc webgl-triangle/webgl_draw_triangle.c -lGL
  -s OFFSCREEN_FRAMEBUFFER=1 -DEXPLICIT_SWAP=1
  -DDRAW_FROM_CLIENT_MEMORY=1 -s FULL_ES2=1
  -o webgl-triangle/build/test.html

geometry cube SDL

 // self.btest('cubegeom_pre3.c',
 // reference='cubegeom_pre2.png',
 // args=['-s', 'LEGACY_GL_EMULATION=1', '-lGL', '-lSDL'])

 emcc cubegeom_pre3.c -s LEGACY_GL_EMULATION=1 -lGL
 -lSDL -o build/test.html preload-file res

Test mem-cpu

  emcc cpu-mem/benchmark_memcpy.cpp -DBUILD_FOR_SHELL
  -I tests/tick.h -s WASM=0 -s TOTAL_MEMORY=512MB
  --memory-init-file 1  -o cpu-mem/nik.html

看看:

https://github.com/zlatnaspirala/c-cpp-to-javascript