FFmpeg支持QUIC

2024-01-23 07:08
文章标签 ffmpeg 支持 quic

本文主要是介绍FFmpeg支持QUIC,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

FFmpeg支持QUIC

  • 1 背景
  • 2 代码地址
  • 3 方案
    • 3.1 bequic - Google Quiche封装
    • 3.2 FFmpeg - 增加quic协议
  • 4 编译
    • 4.1 Windows
      • 4.1.1 编译环境
      • 4.1.2 目录结构
      • 4.1.3 编译bequic
        • 4.1.3.1 下载bequic源码
        • 4.1.3.2 下载chromium源码
        • 4.1.3.3 打bequic补丁
        • 4.1.3.4 生成工程
        • 4.1.3.5 编译 bequic库
        • 4.1.3.6 编译quic_server - 用于测试
      • 4.1.4 编译FFmpeg
        • 4.1.4.1 安装依赖
        • 4.1.4.2 下载支持bequic的FFmpeg源码
        • 4.1.4.3 处理bequic库的符号
        • 4.1.4.4 configure
        • 4.1.4.5 编译
    • 4.2 Android
      • 4.2.1 编译环境
      • 4.2.2 目录结构
      • 4.2.3 编译bequic
        • 4.2.3.1 下载bequic源码
        • 4.2.3.2 下载chromium源码
        • 4.2.3.3 打bequic补丁
        • 4.2.3.4 生成工程
        • 4.2.3.5 编译 bequic库
      • 4.2.4 编译FFmpeg
        • 4.2.4.1 下载支持bequic的FFmpeg源码
        • 4.2.4.2 编译
        • 4.2.4.3 Androd端简单测试
    • 4.3 Linux
      • 4.3.1 编译环境
      • 4.3.2 目录结构
      • 4.3.3 编译bequic
        • 4.3.3.1 下载bequic源码
        • 4.3.3.2 下载chromium源码
        • 4.3.3.3 打bequic补丁
        • 4.3.3.4 生成工程
        • 4.3.3.5 编译bequic库
      • 4.3.4 编译FFmpeg
        • 4.3.4.1 下载支持bequic的FFmpeg源码
        • 4.3.4.2 configure
        • 4.3.4.3 编译
        • 4.3.4.4 测试
    • 4.4 iOS
      • 4.4.1 编译环境
      • 4.4.2 目录结构
      • 4.4.3 编译bequic
        • 4.4.3.1 下载bequic源码
        • 4.4.3.2 下载chromium源码
        • 4.4.3.3 打bequic补丁
        • 4.4.3.4 生成工程
        • 4.4.3.5 编译bequic库
      • 4.4.4 编译测试程序
    • 4.5 TBD
  • 5 测试
    • 5.1 部署QUIC Server
    • 5.2 启动ffplay

1 背景

QUIC也就是HTTP3,是Google为了解决HTTP2的一些问题提出的基于UDP的传输方案。HTTP2由于队头堵塞、握手延迟等缺陷并没有普及,相反由于QUIC的优势,Youtube已经全面使用了QUIC。现在去看Youtube的视频,对一个HTTP1/2的请求,Youtube返回的HTTP1/2响应中会携带一个支持QUIC协议的头,Chrome缓存该头中携带的地址,下次对该地址的请求会以QUIC协议发出,之后跟该服务的数据交互将以基于UDP的QUIC协议进行。

QUIC的主要优点是减少握手延迟(号称0RTT)、出色的流控(BBR、CUBIC)、多路复用等,已经成为事实上的下一代HTTP标准。但是目前该标准在实现上有两个版本,一个是IETF的版本,一个是Google自己的版本,这两者目前并不互通。

本文介绍了基于Google的QUIC协议封装的bequic库,并集成到FFmpeg中,让FFmpeg可以通过QUIC协议播放视频。目前已经支持Caddy(quic-go)等服务。

2 代码地址

bequic:

https://github.com/sonysuqin/BeQuic

FFmpeg:
https://github.com/sonysuqin/FFmpeg

3 方案

bequic库封装了Google Chromium Quiche库,对外提供C的接口,因此需要完整下载chromium项目代码用于编译。对FFmpeg,需要增加一个quic协议,主要用于调用bequic库。

3.1 bequic - Google Quiche封装

增加一个Chromium的动态库工程,修改chromium/src/net/BUILD.gn(在BeQuic代码的patch目录下)

+  shared_library("libbequic") {
+    sources = [
+      "tools/quic/basic_streambuf.hpp",
+      "tools/quic/basic_streambuf_fwd.hpp",
+      "tools/quic/be_quic_define.h",
+      "tools/quic/be_quic.h",
+      "tools/quic/be_quic.cc",
+      "tools/quic/be_quic_client.h",
+      "tools/quic/be_quic_client.cc",
+      "tools/quic/be_quic_client_manager.h",
+      "tools/quic/be_quic_client_manager.cc",
+      "tools/quic/be_quic_fake_proof_verifier.h",
+      "tools/quic/be_quic_fake_proof_verifier.cc",
+      "tools/quic/be_quic_spdy_client.h",
+      "tools/quic/be_quic_spdy_client.cc",
+      "tools/quic/be_quic_spdy_client_session.h",
+      "tools/quic/be_quic_spdy_client_session.cc",
+      "tools/quic/be_quic_spdy_client_stream.h",
+      "tools/quic/be_quic_spdy_client_stream.cc",
+      "tools/quic/buffer.hpp",
+      "tools/quic/streambuf.hpp",
+    ]
+    deps = [
+      ":net",
+      ":simple_quic_tools",
+      "//base",
+      "//build/win:default_exe_manifest",
+      "//url",
+    ]
+    defines = [ "BE_QUIC_EXPORTS", "BE_QUIC_SHARED_LIBRARY" ]
+  }

添加的文件就是bequic库的实现文件(在BeQuic代码的src/chromium目录下),主要实现了以下接口:

  • be_quic_open:建立一个QUIC会话,并打开一个流;
  • be_quic_close:关闭QUIC会话,关闭所有流;
  • be_quic_read:读QUIC会话当前流的数据;
  • be_quic_seek:Seek到文件指定位置,可能会打开一个新的流。

对seek来说,传统HTTP使用的是带Range头的请求,而Youtube目前并没有使用这个头,而是在URL中携带range参数:http://xx.com/xx.html?……&range=1024-2048&……

对BoringSSL与OpenSSL可能的符号冲突,参考这个链接:https://boringssl.googlesource.com/boringssl/+/HEAD/INCORPORATING.md,需要编译成动态库并隐藏符号。

3.2 FFmpeg - 增加quic协议

这里在FFmpeg4.1分支上创建了一个4.1.quic分支,可以在https://github.com/sonysuqin/FFmpeg上查看基于该分支的修改,主要是修改了configure、Makefile,并在libavformat下增加了bequic.c,用于调用bequic库。

在Windows下,FFMpeg使用MSYS2+MINGW32+GCC编译,chromium使用clang-cl编译,两者的符号不一致,需要使用dlltool等工具对chromium项目编译出的bequic库进行处理,得到GCC可以链接的库。

4 编译

4.1 Windows

4.1.1 编译环境

软件版本
Windows10
MSYS2 + MINGW最新版,还要安装GCC等工具
Chromium最新版,版本号4c428bdc69a2c16fdb0c5576e4098373bd6cc4e3
FFMpeg4.1

4.1.2 目录结构

确保目录结构如下:

quic
|-- BeQuic
|-- chromium
`-- FFmpeg

4.1.3 编译bequic

4.1.3.1 下载bequic源码

在quic目录下,执行:

git clone https://github.com/sonysuqin/BeQuic.git
4.1.3.2 下载chromium源码

在quic目录下,按照chromium的官方编译文档,下载chromium代码(需要一个比较好的VPN)。

4.1.3.3 打bequic补丁

使用MSYS2进入BeQuic/patch目录下,执行

./patch.sh

该脚本的作用:

  • 把BeQuic/patch/BUILD.gn拷贝到chromium/src/net目录下;
  • 把BeQuic/src/chromium下的文件拷贝到chromium/src/net/tools/quic目录下;

补丁并不修改chromium的源代码。

4.1.3.4 生成工程

在chromium/src下执行:

gn gen out/Debug--args="is_debug=true is_component_build=false target_cpu=\"x86\""

这里可以决定是产生Debug版还是Release版。

4.1.3.5 编译 bequic库

在chromium/src下执行:

ninja -C out\Debug libbequic
4.1.3.6 编译quic_server - 用于测试

在chromium/src下执行:

ninja -C out\Debug quic_server

4.1.4 编译FFmpeg

4.1.4.1 安装依赖

安装GCC、SDL2等FFmpeg通常需要依赖的工具,主要参考了以下这些网页:
《msys2和SDL2环境搭建》
《windows下编译FFMPEG篇》
《Windows10平台编译ffmpeg 4.0.2,生成ffplay》

4.1.4.2 下载支持bequic的FFmpeg源码

在quic目录下,执行

git clone https://github.com/sonysuqin/FFmpeg-Quic-Cronet.git
4.1.4.3 处理bequic库的符号

将BeQuic/script/gen_a.sh拷贝到chromium/src/out/Debug目录下,执行:

./gen_a.sh

该脚本很简单:

gendef libbequic.dll
dlltool --kill-at -d libbequic.def --dllname libbequic.dll -l libbequic.a

使用gendef产生libbequic.dll的def文件,然后用dlltool产生GCC可以链接的libbequic.a。

4.1.4.4 configure

在FFmpeg目录下,执行:

mkdir build
cd build
../configure --disable-static --enable-shared --enable-gpl --enable-version3 --enable-sdl --enable-debug=3 --disable-optimizations --disable-mmx --disable-stripping --arch=x86 --enable-libbequic --extra-cflags=-I/d/work/google/chromium/src/net/tools/quic --extra-ldflags=-L/d/work/google/chromium/src/out/Debug --extra-libs=-lbequic

注意修改–extra-cflags、–extra-ldflags为实际的bequic库的头文件、库文件的路径。

4.1.4.5 编译

在FFmpeg/build目录下,执行:

make && make install

注意把chromium/src/out/Debug/libbequic.dll拷贝到ffplay运行目录。

4.2 Android

4.2.1 编译环境

软件版本
Ubuntu16.04
NDKr17c
Chromium最新版,版本号e57cf4b40708a719439ad3895279b7de1feb62a8
FFMpeg4.1.quic

4.2.2 目录结构

确保目录结构如下:

quic
|-- BeQuic
|-- chromium
`-- FFmpeg

4.2.3 编译bequic

4.2.3.1 下载bequic源码

在quic目录下,执行:

git clone https://github.com/sonysuqin/BeQuic.git
4.2.3.2 下载chromium源码

在quic目录下,按照chromium的官方编译文档,下载chromium代码(需要一个比较好的VPN)。

4.2.3.3 打bequic补丁

进入BeQuic/patch目录下,执行

mv BUILD.gn BUILD.gn.bak
mv BUILD.gn.Android BUILD.gn
./patch.sh
mv BUILD.gn BUILD.gn.Android
mv BUILD.gn.bak BUILD.gn

目的:

  • 将BeQuic/patch/BUILD.gn.Android覆盖chromium/src/net目录下的BUILD.gn文件;
  • 把BeQuic/src/chromium下的文件拷贝到chromium/src/net/tools/quic目录下;

补丁并不修改chromium的源代码。

4.2.3.4 生成工程

在chromium/src下执行:

gn gen out/Release --args="is_debug=false is_component_build=false target_os=\"android\"  target_cpu=\"arm\""

这里可以决定是产生Debug版还是Release版。

4.2.3.5 编译 bequic库

在chromium/src下执行:

ninja -C out/Release libbequic

4.2.4 编译FFmpeg

4.2.4.1 下载支持bequic的FFmpeg源码

在quic目录下,执行

git clone https://github.com/sonysuqin/FFmpeg-Quic-Cronet.git
4.2.4.2 编译

在FFmpeg/build目录下,执行:

./build_android.sh

在编译脚本中,需要指定NDK工具链的路径,libbequic库的头文件、库路径等(如果按照上述目录结构就不用修改),脚本会将编译产生的所有输出放在当前目录的android目录下。

4.2.4.3 Androd端简单测试

用Android Studio(3.4)打开BeQuic/test/android目录下的TestFFmpegQuic工程,将4.2.4.2节编译产生的所有.so库拷贝到BeQuic/test/android/TestFFmpegQuic/FFmpegQuic/src/main/jni/FFmpeg/lib/armeabi-v7a目录下,连接Android手机,编译、运行。

4.3 Linux

4.3.1 编译环境

软件版本
Ubuntu16.04
clang3.8.0-2ubuntu4
Chromium最新版,版本号ec12ef7159674fc37fd340f12aeb81fccfb547a6
FFMpeg4.1.quic

4.3.2 目录结构

确保目录结构如下

quic
|-- BeQuic
|-- chromium
`-- FFmpeg

4.3.3 编译bequic

4.3.3.1 下载bequic源码

创建并进入quic目录,执行

git clone https://github.com/sonysuqin/BeQuic.git
4.3.3.2 下载chromium源码

在quic目录下,按照chromium的官方编译文档,下载chromium代码(需要一个比较好的VPN)。

4.3.3.3 打bequic补丁

进入BeQuic/patch目录下,执行

./patch.sh

目的:

  • 将BeQuic/patch/BUILD.gn覆盖chromium/src/net目录下的BUILD.gn文件;
  • 把BeQuic/src/chromium下的文件拷贝到chromium/src/net/tools/quic目录下;

补丁并不修改chromium的源代码。

4.3.3.4 生成工程

在chromium/src下执行:

gn gen out/linux_release_x64_notcmalloc --args="is_debug=false is_component_build=false target_os=\"linux\" target_cpu=\"x64\" use_allocator=\"none\""

这里可以决定是产生Debug版还是Release版;
user_allocator=“none” :表示编译时malloc等系统库使用系统库函数,而不调用chromium自己实现的tcmalloc。

4.3.3.5 编译bequic库

在chromium/src下执行:

ninja -C out/linux_release_x64_notcmalloc libbequic

4.3.4 编译FFmpeg

4.3.4.1 下载支持bequic的FFmpeg源码

在quic目录下,执行

git clone https://github.com/sonysuqin/FFmpeg-Quic-Cronet.git

切换ffmepg版本为: 4.1.quic

4.3.4.2 configure

在FFmpeg下创建build目录,并进入FFmpeg/build目录,执行

../configure --disable-static --enable-shared --enable-gpl --enable-version3 --enable-sdl --enable-debug=3 --disable-optimizations --disable-mmx --disable-stripping --arch=x64 --enable-libbequic --extra-cflags="-I../../quic/chromium/src/net/tools/quic -fPIC" --extra-ldflags="-L../../quic/chromium/src/out/linux_release_x64 -fPIC" --extra-libs=-lbequic --prefix=../linux

注意修改–extra-cflags、–extra-ldflags为实际的bequic库的头文件、库文件的路径.。

4.3.4.3 编译

在FFmpeg/build目录下,执行

make && make install
4.3.4.4 测试

将libbequic.so拷贝到FFmpeg/build/lib下,执行

export LD_LIBRARY_PATH=<filepath>/ffmpeg/build/lib

然后在FFmpeg/build执行

./ffplay quic://www.example.org:6121 -timeout 1000 -verify_certificate 1

4.4 iOS

4.4.1 编译环境

软件版本
mac10.14
clangx86_64-apple-darwin18.0.0
Chromium最新版,版本号eca01417caf1e26ce41c88f2804291ddee75f5ed
xcode10.1

4.4.2 目录结构

确保目录结构如下

quic
|-- BeQuic
|-- chromium

4.4.3 编译bequic

4.4.3.1 下载bequic源码

在quic目录下,执行:

git clone https://github.com/sonysuqin/BeQuic.git
4.4.3.2 下载chromium源码

在quic目录下,按照chromium的官方编译文档,下载chromium代码(需要一个比较好的VPN)。

4.4.3.3 打bequic补丁

进入BeQuic/patch目录下,执行

mv BUILD.gn BUILD.gn.bak
mv BUILD.gn.ios BUILD.gn
./patch.sh
mv BUILD.gn BUILD.gn.ios
mv BUILD.gn.bak BUILD.gn

目的:

  • 将BeQuic/patch/BUILD.gn.ios覆盖chromium/src/net目录下的BUILD.gn文件;
  • 把BeQuic/src/chromium下的文件拷贝到chromium/src/net/tools/quic目录下;

补丁并不修改chromium的源代码。

4.4.3.4 生成工程

在chromium/src下执行:

gn gen out/ios_arm64_shared --args="is_debug=false is_component_build=false target_os=\"ios\" target_cpu=\"arm64\" ios_code_signing_identity=\"DB1A2124EA21DA7F2BECD69186C8DCFB4A1B7CC7\"" --ide=xcode

ios_code_signing_identity代表签名,使用下面命令查看本机所有签名

find-identity -v -p codesigning
4.4.3.5 编译bequic库

在chromium/src下执行

ninja -C out/ios_arm64_shared libbequic

注意:如果使用编译后的库,程序可以正常调用,但是执行后会出现下面的错误:
dyld: (Library not loaded: ./libbequic.dylib … Reason: image not found)
在终端下查看,执行

$otool -L libbequic.dylib libbequic.dylib:./libbequic.dylib (compatibility version 0.0.0, current version 0.0.0)/System/Library/Frameworks/CoreFoundation.framework/CoreFoundation (compatibility version 150.0.0, current version 1560.10.0)/System/Library/Frameworks/CoreGraphics.framework/CoreGraphics (compatibility version 64.0.0, current version 1245.9.2)/System/Library/Frameworks/CoreText.framework/CoreText (compatibility version 1.0.0, current version 1.0.0)/System/Library/Frameworks/Foundation.framework/Foundation (compatibility version 300.0.0, current version 1560.10.0)/System/Library/Frameworks/UIKit.framework/UIKit (compatibility version 1.0.0, current version 61000.0.0)/System/Library/Frameworks/CFNetwork.framework/CFNetwork (compatibility version 1.0.0, current version 975.0.3)/System/Library/Frameworks/MobileCoreServices.framework/MobileCoreServices (compatibility version 1.0.0, current version 935.2.0)/System/Library/Frameworks/Security.framework/Security (compatibility version 1.0.0, current version 58286.222.2)/System/Library/Frameworks/SystemConfiguration.framework/SystemConfiguration (compatibility version 1.0.0, current version 963.200.27)/usr/lib/libresolv.9.dylib (compatibility version 1.0.0, current version 1.0.0)/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1252.200.5)/usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 228.0.0)

ios动态库的链接路径不能使用相对路径,否则无法找到链接文件。

修改动态库的查找路径

install_name_tool -id @rpath/libbequic.dylib libbequic.dylib

再用命令otool -L libbequic.dylib查看,发现已经修改。

4.4.4 编译测试程序

使用xcode打开Bequic/test/ios/quic_shared_test/quic_test.xcodeproj,编译后测试。

4.5 TBD

Mac OSX.

5 测试

5.1 部署QUIC Server

这里使用我们自研的Nginx Quic Server,作者为evansun922,Github地址为:https://github.com/evansun922/nginx-quic。
这里贴出我使用的配置:

worker_rlimit_nofile  51200;
worker_processes      auto;
worker_cpu_affinity   auto;#daemon off;
#master_process off;user  root;                                                                                                                                                                            #pid /var/log/nginx/nginx.pid;events {worker_connections      1024;use                     epoll;
}http {server_tokens           off;include                 mime.types;default_type            application/octet-stream;log_format              main  '$remote_addr - $remote_user [$time_local] "$request" 'access_log              logs/access.log     main;error_log               logs/error.log debug;sendfile                on;keepalive_timeout       65;#gzip                   on;server {listen              80 so_keepalive=60s:5s:6;server_name         roblin.cn;root                /home/roblin/root;listen              443 quic reuseport sndbuf=1048576 rcvbuf=1048576;quic_ssl_certificate      /etc/letsencrypt/live/roblin.cn/fullchain.pem;quic_ssl_certificate_key  /etc/letsencrypt/live/roblin.cn/privkey.pkcs8;quic_bbr            on;listen              443 ssl; # managed by Certbotssl_certificate     /etc/letsencrypt/live/roblin.cn/fullchain.pem; # managed by Certbotssl_certificate_key /etc/letsencrypt/live/roblin.cn/privkey.pem; # managed by Certbotinclude             /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbotssl_dhparam         /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbotadd_header          Access-Control-Allow-Origin *;add_header          Access-Control-Allow-Method *;add_header          alt-svc "quic=\":443\"; ma=500; v=\"48,47,46,44,43,39\"";location / {add_header      Access-Control-Allow-Origin *;add_header      Access-Control-Allow-Method *;add_header      alt-svc "quic=\":443\"; ma=500; v=\"48,47,46,44,43,39\"";index           index.html index.htm;expires         -1;}}
}

其中证书用的是Let‘s Encrypt的证书.

5.2 启动ffplay

在FFmpeg/build目录下,执行:

./ffplay.exe quics://roblin.cn:443/video/mao.mp4

在这里插入图片描述

这篇关于FFmpeg支持QUIC的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/635595

相关文章

Python基于wxPython和FFmpeg开发一个视频标签工具

《Python基于wxPython和FFmpeg开发一个视频标签工具》在当今数字媒体时代,视频内容的管理和标记变得越来越重要,无论是研究人员需要对实验视频进行时间点标记,还是个人用户希望对家庭视频进行... 目录引言1. 应用概述2. 技术栈分析2.1 核心库和模块2.2 wxpython作为GUI选择的优

SpringKafka消息发布之KafkaTemplate与事务支持功能

《SpringKafka消息发布之KafkaTemplate与事务支持功能》通过本文介绍的基本用法、序列化选项、事务支持、错误处理和性能优化技术,开发者可以构建高效可靠的Kafka消息发布系统,事务支... 目录引言一、KafkaTemplate基础二、消息序列化三、事务支持机制四、错误处理与重试五、性能优

一文教你解决Python不支持中文路径的问题

《一文教你解决Python不支持中文路径的问题》Python是一种广泛使用的高级编程语言,然而在处理包含中文字符的文件路径时,Python有时会表现出一些不友好的行为,下面小编就来为大家介绍一下具体的... 目录问题背景解决方案1. 设置正确的文件编码2. 使用pathlib模块3. 转换路径为Unicod

定价129元!支持双频 Wi-Fi 5的华为AX1路由器发布

《定价129元!支持双频Wi-Fi5的华为AX1路由器发布》华为上周推出了其最新的入门级Wi-Fi5路由器——华为路由AX1,建议零售价129元,这款路由器配置如何?详细请看下文介... 华为 Wi-Fi 5 路由 AX1 已正式开售,新品支持双频 1200 兆、配有四个千兆网口、提供可视化智能诊断功能,建

音视频入门基础:WAV专题(10)——FFmpeg源码中计算WAV音频文件每个packet的pts、dts的实现

一、引言 从文章《音视频入门基础:WAV专题(6)——通过FFprobe显示WAV音频文件每个数据包的信息》中我们可以知道,通过FFprobe命令可以打印WAV音频文件每个packet(也称为数据包或多媒体包)的信息,这些信息包含该packet的pts、dts: 打印出来的“pts”实际是AVPacket结构体中的成员变量pts,是以AVStream->time_base为单位的显

ffmpeg面向对象-待定

1.常用对象 rtsp拉流第一步都是avformat_open_input,其入参可以看下怎么用: AVFormatContext *fmt_ctx = NULL;result = avformat_open_input(&fmt_ctx, input_filename, NULL, NULL); 其中fmt_ctx 如何分配内存的?如下 int avformat_open_input(

Golang支持平滑升级的HTTP服务

前段时间用Golang在做一个HTTP的接口,因编译型语言的特性,修改了代码需要重新编译可执行文件,关闭正在运行的老程序,并启动新程序。对于访问量较大的面向用户的产品,关闭、重启的过程中势必会出现无法访问的情况,从而影响用户体验。 使用Golang的系统包开发HTTP服务,是无法支持平滑升级(优雅重启)的,本文将探讨如何解决该问题。 一、平滑升级(优雅重启)的一般思路 一般情况下,要实现平滑

sqlite不支持中文排序,采用java排序

方式一 不支持含有重复字段进行排序 /*** sqlite不支持中文排序,改用java排序* 根据指定的对象属性字段,排序对象集合,顺序* @param list* @param field* @return*/public static List sortListByField(List<?> list,String field){List temp = new ArrayList(

一款支持同一个屏幕界面同时播放多个视频的视频播放软件

GridPlayer 是一款基于 VLC 的免费开源跨平台多视频同步播放工具,支持在一块屏幕上同时播放多个视频。其主要功能包括: 多视频播放:用户可以在一个窗口中同时播放任意数量的视频,数量仅受硬件性能限制。支持多种格式和流媒体:GridPlayer 支持所有由 VLC 支持的视频格式以及流媒体 URL(如 m3u8 链接)。自定义网格布局:用户可以配置播放器的网格布局,以适应不同的观看需求。硬

Science Robotics 首尔国立大学研究团队推出BBEX外骨骼,实现多维力量支持!

重复性举起物体可能会对脊柱和背部肌肉造成损伤,由此引发的腰椎损伤是工业环境等工作场所中一个普遍且令人关注的问题。为了减轻这类伤害,有研究人员已经研发出在举起任务中为工人提供辅助的背部支撑装置。然而,现有的这类装置通常无法在非对称性的举重过程中提供多维度的力量支持。此外,针对整个人体脊柱的设备安全性验证也一直是一个缺失的环节。 据探索前沿科技边界,传递前沿科技成果的X-robot投稿,来自首尔国立