项目简介
本项目借助C语言实现了一个QUIC流媒体播放系统。通过集成bequic库,达成了基于QUIC协议的视频播放功能。QUIC协议具备低延迟、高可靠性、多路复用等特性,已成为下一代HTTP标准。此项目旨在为流媒体播放系统提供基于QUIC协议的传输方式,提升流媒体传输的效率与稳定性。
项目的主要特性和功能
- QUIC协议支持:集成bequic库,支持通过QUIC协议进行流媒体播放。
- 流媒体解码:利用FFmpeg库实现流媒体解码,支持多种音视频格式。
- 网络适应性:借助QUIC协议,提高流媒体传输效率和稳定性,适用于各种网络环境。
- 跨平台支持:支持Windows、Linux、Android、iOS等多个平台。
- 测试框架:提供简单测试框架,用于验证系统功能和性能。
安装使用步骤
1. 环境准备
根据目标平台,安装相应的编译环境和依赖库: - Windows:Windows 10,安装MSYS2 + MINGW最新版及GCC等工具,Chromium最新版(版本号4c428bdc69a2c16fdb0c5576e4098373bd6cc4e3),FFMpeg 4.1。 - Android:Ubuntu 16.04,NDK r17c,Chromium最新版(版本号e57cf4b40708a719439ad3895279b7de1feb62a8),FFMpeg 4.1.quic。 - Linux:Ubuntu 16.04,clang 3.8.0 - 2ubuntu4,Chromium最新版(版本号ec12ef7159674fc37fd340f12aeb81fccfb547a6),FFMpeg 4.1.quic。 - iOS:mac 10.14,clang x86_64 - apple - darwin18.0.0,Chromium最新版(版本号eca01417caf1e26ce41c88f2804291ddee75f5ed),xcode 10.1。
2. 源码获取
假设用户已经下载了本项目的源码文件。
3. 编译bequic库
根据目标平台进行编译:
- Windows:
- 下载chromium源码:在quic目录下,按chromium官方编译文档下载。
- 打bequic补丁:使用MSYS2进入BeQuic/patch目录下,执行./patch.sh
。
- 生成工程:在chromium/src下执行gn gen out/Debug--args="is_debug=true is_component_build=false target_cpu=\"x86\""
。
- 编译bequic库:在chromium/src下执行ninja -C out\Debug libbequic
。
- 编译quic_server(用于测试):在chromium/src下执行ninja -C out\Debug quic_server
。
- Android:
- 下载chromium源码:在quic目录下,按chromium官方编译文档下载。
- 打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
。
- 生成工程:在chromium/src下执行gn gen out/Release --args="is_debug=false is_component_build=false target_os=\"android\" target_cpu=\"arm\""
。
- 编译bequic库:在chromium/src下执行ninja -C out/Release libbequic
。
- Linux:
- 下载chromium源码:在quic目录下,按chromium官方编译文档下载。
- 打bequic补丁:进入BeQuic/patch目录下,执行./patch.sh
。
- 生成工程:在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\""
。
- 编译bequic库:在chromium/src下执行ninja -C out/linux_release_x64_notcmalloc libbequic
。
- iOS:
- 下载chromium源码:在quic目录下,按chromium官方编译文档下载。
- 打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
。
- 生成工程:在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
。
- 编译bequic库:在chromium/src下执行ninja -C out/ios_arm64_shared libbequic
,并修改动态库查找路径install_name_tool -id @rpath/libbequic.dylib libbequic.dylib
。
4. 编译FFmpeg
- Windows:
- 安装依赖:参考相关网页安装GCC、SDL2等依赖工具。
- 处理bequic库的符号:将BeQuic/script/gen_a.sh拷贝到chromium/src/out/Debug目录下,执行
./gen_a.sh
。 - 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
(注意修改路径)。 - 编译:在FFmpeg/build目录下,执行
make && make install
,并把chromium/src/out/Debug/libbequic.dll拷贝到ffplay运行目录。 - Android:
- 编译:在FFmpeg/build目录下,执行
./build_android.sh
(需指定相关路径)。 - Android端简单测试:用Android Studio(3.4)打开BeQuic/test/android目录下的TestFFmpegQuic工程,将编译产生的所有.so库拷贝到BeQuic/test/android/TestFFmpegQuic/FFmpegQuic/src/main/jni/FFmpeg/lib/armeabi - v7a目录下,连接Android手机,编译、运行。
- Linux:
- 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
(注意修改路径)。 - 编译:在FFmpeg/build目录下,执行
make && make install
。 - 测试:将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
。 - iOS:使用xcode打开Bequic/test/ios/quic_shared_test/quic_test.xcodeproj,编译后测试。
5. 运行测试
在Google的Playing With QUIC页面有测试的详细介绍,这里以Windows端为例:
- 准备测试文件:
- 准备文件源:准备一个HTTP服务(如nginx),在其html根目录放置1.mp4文件。
- 修改hosts:在本机(Windows10)修改hosts,192.168.116.133 www.example.org
。
- 下载文件源并保留HTTP头:在MSYS2下,执行mkdir /tmp/quic-data; cd /tmp/quic-data; wget -p --save-headers http://www.example.org/1.mp4
。
- 修改HTTP头:使用编辑器修改/tmp/quic-data/www.example.org/1.mp4的HTTP头,删除"Transfer - Encoding: chunked"和"Alternate - Protocol"头,增加"X - Original - Url: https://www.example.org/"头。
- 修改hosts:在本机(Windows10)修改hosts,127.0.0.1 www.example.org
。
- 生成并安装证书:
- 生成证书:进入chromium/src/net/tools/quic/certs目录,执行./generate-certs.sh
。
- 安装证书:进入chromium/src/net/tools/quic/certs/out目录,执行certutil -addstore -f "ROOT" 2048 - sha256 - root.pem
。
- 启动quic - server:在chromium/src目录下,执行./out/Debug/quic_server --quic_response_cache_dir=/tmp/quic-data/www.example.org --certificate_file=net/tools/quic/certs/out/leaf_cert.pem --key_file=net/tools/quic/certs/out/leaf_cert.pkcs8
。
- 启动ffplay:在FFmpeg/build目录下,执行./ffplay quic://www.example.org:6121 -timeout 1000 -verify_certificate 1
(若设置-verify_certificate 0
,可省略证书生成和安装环节)。
下载地址
点击下载 【提取码: 4003】【解压密码: www.makuang.net】