我一直在尝试使用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
非常感谢 - 对于此代码示例我可以使用的替代库的任何其他建议将非常感激:)
答案 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
看看: