# ffmpeg_player **Repository Path**: yudaichen/ffmpeg_player ## Basic Information - **Project Name**: ffmpeg_player - **Description**: c++基于ffmpeg实现的QT_player播放器 - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-12-17 - **Last Updated**: 2023-08-30 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # ffmpeg_player #### 介绍 基于ffmpeg实现的QT_player播放器 #### 软件架构 folly/2022.01.31.00 rttr/0.9.6 rxcpp/4.1.1 leveldb/1.23 rocksdb/6.29.5 yaml-cpp/0.7.0 dbg-macro/0.4.0 gtest/cci.20210126 taskflow/3.4.0 pprint/0.9.1 range-v3/0.12.0 libunifex/cci.20220430 libpng/1.6.37 zlib/1.2.12 bzip2/1.0.8 brotli/1.0.9 openssl/1.1.1q ffmpeg/4.4.3 qt/5.15.2 ccache/4.6 #### 安装教程 ##### 编译debug conan install . -s build_type=Debug --install-folder=./cmake/debug ##### release版本 conan install . -s build_type=Release --install-folder=./cmake/release #### 使用说明 asio 异步读写 异步读取网络数据使用到了2个读取的函数: boost::asio::async_read,需要指定需要读取的buffer的指针和长度,和lambda函数,只有当buffer的长度读取满了之后,lambda函数才会被执行。 boost::asio::async_read_until 需要指定streambuf和一个特殊的字符,只有当读取的数据里面包含指定的字符时,指定的lambda函数才会被执行,lambda函数执行,streambuf里面的数据包含指定的字符,但指定字符可能在中间。在分析http和rtsp的时候,需要使用“\r\n\r\n”,来检测信令结束。 asio写数据async_write也是异步的,有几个注意项: 一次只能发起一个写请求,buffer完整写完之后,回调函数才会被执行,所以就需要一个发送队列来保存将要发送的数据。 写数据的时候,为了提高发送效率,支持了ConstBufferSequence类似writev支持多个buffer,多个buffer通过ConstBufferSequence接口来获取。 #查看当前使用的gcc版本命令: gcc -v #更新软件源指令: sudo apt-get update #更新软件指令: sudo app-get upgrade #查看目前GCC的最新版本 http://ftp.gnu.org/gnu/gcc/ #添加相应的源 sudo add-apt-repository ppa:ubuntu-toolchain-r/test #更新软件源 sudo apt-get update #安装最新版gcc sudo apt-get install gcc-12 g++12 # 命令最后的 20和50是优先级,如果使用auto选择模式,系统将默认使用优先级高的 ## 查看级别 sudo update-alternatives --config gcc sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-11.3 20 sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-12.1 50 sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-11 11 sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-12 12 sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-11 11 update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-13 80 --slave /usr/bin/gcc-ar gcc-ar /usr/bin/gcc-ar-13 --slave /usr/bin/gcc-nm gcc-nm /usr/bin/gcc-nm-13 --slave /usr/bin/gcc-ranlib gcc-ranlib /usr/bin/gcc-ranlib-13 update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-12 80 --slave /usr/bin/gcc-ar gcc-ar /usr/bin/gcc-ar-12 --slave /usr/bin/gcc-nm gcc-nm /usr/bin/gcc-nm-12 --slave /usr/bin/gcc-ranlib gcc-ranlib /usr/bin/gcc-ranlib-12 #零时修改文件最大打开数 ulimit -HSn 102400 #### 参与贡献 使用clang将std lib导入为模块有以下几个步骤: 确保你的clang编译器版本支持C++20,因为C++20才支持模块化特性。 在编译命令中添加-std=c++20 -fmodules选项,启用模块化特性。 使用-fmodule-map-file选项指定模块映射文件的路径,该文件包含了std lib的模块信息。 在模块映射文件中指定std lib的模块依赖关系和头文件路径。示例模块映射文件: module std.core { requires cplusplus; requires libc; requires libm; header "algorithm" header "array" header "chrono" // ... } 在源文件中使用import std.core语句导入std lib的模块。 完整的编译命令示例: clang++ -std=c++20 -fmodules -fmodule-map-file=std.modulemap main.cpp -o main 请注意,上述步骤仅适用于将std lib导入为模块的情况。对于其他库的模块化,需要根据实际情况调整步骤和操作 #### 特技