- 博客(52)
- 资源 (2)
- 收藏
- 关注

原创 h264编码原理
一、视频压缩基本原理1、预测编码所谓预测,就是根据已知信息来推断所需要的信息。预测编码就是根据其他帧或当前帧其他位置的像素点,预测待编码位置的像素点,并将实际值与预测值相减,得到残差值,编码时存储残差值来代替原始值,可大大减少存储比特。预测编码分为两大类:基于时间的预测(帧间预测)和基于空间的预测(帧内预测)。1.1.1帧间预测视频帧在时间上有极大的连续性和相关性。自己可以拍摄一个视频,对比视频中的任意相邻两帧,除了转场的画面外,其余临近帧的像素差别很小。利用这一特性,可以实现帧间预测。1.1.2
2022-04-14 06:44:14
4693

原创 Anbox源码分析(二)——Anbox渲染原理
Anbox源码分析(二)上一篇,我们大概了解了Anbox的基本架构和安装方法。这篇文章我们来分析下Anbox的视频渲染原理。Android加载OpenGL ES的流程在介绍Anbox的视频渲染原理前,我们先要了解Android加载OpenGL ES的流程。OpenGL ES (OpenGL for Embedded Systems) 是OpenGL的一个子集,可以说是为了嵌入式设备而专门裁...
2020-04-22 14:47:19
6134
原创 Android音频采集
在 Android 开发领域,音频采集是一项非常重要且有趣的功能。它为各种应用程序,如语音聊天、音频录制、多媒体内容创作等提供了基础支持。今天我们就来深入探讨一下 Android 音频采集的两大类型:Mic 音频采集和系统音频采集。
2024-11-22 10:04:17
1722
原创 音视频基础知识
在当今数字化的多媒体世界中,音视频技术无处不在,从我们日常的娱乐消遣到专业的影视制作、远程通信等领域,都离不开音视频的支撑。本文将带您了解音视频的基础知识,为您揭开这一神秘领域的面纱。我们以视频通话为例,看看其中涉及了哪些知识。
2024-11-22 09:55:08
983
原创 创建 Android bks证书
需要创建密码,不然下一步会失败(未分析原因)1、使用公钥证书和私钥证书生成p12证书。tmp.p12 是目标生成文件p12证书。public.crt 是公钥证书;创建 Android bks证书。private.key 是私钥;2、将p12证书转成bks证书。
2024-03-18 15:29:28
540
原创 webrtc源码阅读之NACK
NACK(Negative Acknowledgement)机制是WebRTC中用于处理数据包丢失的重要机制。用于在数据包丢失时通知发送方重新发送丢失的数据包。当接收方检测到数据包丢失时,它会发送一个NACK消息给发送方,请求重新发送丢失的数据包。这种机制可以帮助提高通信质量和可靠性,尤其在不可靠的网络环境下。本文将从webrtc源码分析nack的实现,版本m98。
2023-07-17 17:27:11
652
原创 webrtc源码阅读之视频RTP接收&&JitterBuffer
在音视频通信中,网络抖动和延迟是常见的问题,会导致音视频质量下降和用户体验不佳。为了解决这些问题,WebRTC引入了Jitter Buffer(抖动缓冲区)这一重要组件。Jitter Buffer是一个缓冲区,用于接收和处理网络传输中的音频和视频数据。它的主要作用是解决网络抖动和延迟带来的问题,以提供更稳定和流畅的音视频传输。Jitter Buffer通过调整数据包的接收和播放时间,使得音视频数据能够按照正确的顺序和时序进行解码和播放。本文将从webrtc源码分析jitter buffer的实现,版本。
2023-07-14 13:53:51
2851
1
原创 webrtc源码阅读之h264 RTP打包
实时传输协议(RTP)是一个网络协议,它允许在网络上进行实时的音频和视频数据传输。RTP协议主要用于解决多媒体数据的实时传输问题,特别是对延迟和数据丢失敏感的应用。RTP协议包括两个紧密相关的部分:RTP数据协议和RTP控制协议(RTCP)。RTP数据协议负责数据的传输,RTCP负责监控服务质量并提供同步和标识信息。RTP协议并不保证数据的可靠传输,因为在实时应用中,比起保证数据的完整性,降低延迟和抖动更为重要。因此,RTP通常运行在不可靠的传输协议(如UDP)之上。
2023-07-05 16:17:29
1877
原创 webrtc源码阅读之视频采集、编码、发送
在examples/peerconnection源码阅读中,我们有个关键函数,在这个函数中会先Create一个video track,然后把这个track add到peerconnection中。从而进行视频采集、编码和发送。
2023-06-30 09:09:48
1173
原创 webrtc源码阅读之examples/peerconnection
阅读webrtc源码,从examples中的peerconnection开始。
2023-06-27 09:02:11
1112
原创 Android coredump生成与APK调试
一直苦于Android底层C++代码的调试,以前都是通过打日志的方法调试的,效率极低。但是Linux下就可以用gdb 来调试coredump,那么Android应该也可以才对。关于Linux下Coredump调试可以参考这篇文章:Linux coredump 调试然后我按照Linux的方法设置了ulimit -c 和 coredump生成位置。结果,根本就不生成coredump文件。一、纯C\C++生成Coredump========================================
2022-04-01 06:28:22
1772
原创 6 live555源码分析(六)——live555 RTSP工作流程(三)
live555继承关系比较复杂,所以做图记录下h264文件发送过程中关键变量的类型。上一篇从源码分析了OPTION和DESCRIBE的运行流程。这篇分析剩下的SETUP和PLAY的运行流程。一、 SETUP if (!requestIncludedSessionId) { // No session id was present in the request. // So create a new "RTSPClientSession" object for this request.
2021-10-30 21:57:35
884
4
原创 5 live555源码分析(五)——live555 RTSP工作流程(二)
上一篇我们通过WireShark抓包获取到了RTSP通信的流程,本篇文章通过代码去分析每个流程的工作原理。live555的继承关系太过复杂,所以做了个图简单记录一下与h264文件传输相关的类继承关系一、OPTIONOPTION比较简单,就是客户端向服务端请求可用的方法。服务端收到客户端发来的OPTION指令后,调用函数handleCmd_OPTIONS进行处理void RTSPServer::RTSPClientConnection::handleCmd_OPTIONS() { snprint
2021-10-30 19:50:01
1658
原创 4 live555源码分析(四)——live555 工作流程(一)
本文继续对live555源码进行分析。以testOnDemandRTSPServer.cpp为例进行分析。本文只分析传输H264文件的过程。一、 mian函数int main(int argc, char** argv) { // Begin by setting up our usage environment: TaskScheduler* scheduler = BasicTaskScheduler::createNew(); env = BasicUsageEnvironment::
2021-10-30 15:00:27
961
原创 3 live555源码分析(三)——live555 任务调度
一、TaskSchedulerTaskScheduler类是任务调度的基础抽象类,live555将任务分为三种类型,分别是延迟任务、事件任务和后台IO任务,在这个类中定义了三种任务的调度函数。TaskScheduler类跟UsageEnvironment定义在相同的文件中UsageEnvironment/include/UsageEnvironment.h:class TaskScheduler {public: virtual ~TaskScheduler(); virtual Task
2021-10-25 15:03:08
1533
1
原创 2 live555源码分析(二)——live555 基础运行环境
一、基础组件总览本篇开始分析live555的基础组件,也就是基础运行环境所需要的组件类。UasgeEnvionment相关类的关系如下图所示UsageEnvironment类是个抽象类,提供基础的运行环境,它依赖于TaskScheduler类来进行任务的调度。BasicUsageEnvironment0继承自UsageEnvironment,是对UsageEnvironment的初步实现,但是也是个抽象类,真正的实现在BasicUsageEnvironment类。BasicUsageEnviron
2021-10-22 10:58:20
927
原创 1 live555源码分析(一)——live555编译与运行
一、live555概述live555是一个基于C++开发的开源的流媒体服务解决方案,它实现了标准的流媒体传输协议(如RTP/RTCP、RTSP、SIP)。官网地址http://www.live555.com/。二、live555源码下载live555可以直接从官网下载,一直在维护更新,可以直接下载最新版http://www.live555.com/liveMedia/public/live555-latest.tar.gz。三、live555编译live555是跨平台的,本文以Linux平台进行分
2021-10-21 16:59:56
3737
1
原创 C++ STL总结(六)string
一、顺序容器概述一个容器就是一些特定类型对象的集合,顺序容器为程序员提供了控制元素存储和访问顺序的能力,这种顺序不依赖与元素的的值,而是与元素加入容器时的位置相对应。STL顺序容器包含:vector:可变大小数组。支持快速随机访问,在尾部以外插入或删除可能很慢deque:双端队列。支持快速随机访问,在头尾插入和删除很快list:双向链表。只支持双向顺序访问。在任意位置插入和删除很快forward list:单向链表。只支持单向顺序访问,在任意位置插入和删除很快array:固定大小数组。支持快速
2021-09-15 19:12:39
390
原创 C++ STL总结(五)forward_list
1.forward_list内存结构forward_list是单向链表,内存结构与list类似,只不过是单向的2.forward_list容量操作函数功能bool empty()检查容器是否为空size_t max_size()返回容器由于系统或库的实现所限制可容纳的元素最大数量void resize(size_t new_size, const T& x)重设容器的size大小,如果size变大,则以默认值填充变长的位置,如果size变小,则删除变短那
2021-09-14 18:52:10
2848
2
原创 C++ STL总结(四)list
1.list内存结构list是双向链表,元素在内存中并不是连续存储的。它在每次插入和删除一个元素时都会申请和释放一个元素的空间。2.list容量操作函数功能bool empty()检查容器是否为空size_t size()返回容器中元素的个数size_t max_size()返回容器由于系统或库的实现所限制可容纳的元素最大数量void resize(size_t new_size, const T& x)重设容器的size大小,如果size变大,
2021-09-14 18:50:43
718
原创 C++ STL总结(三)deque
1.deque内存结构deque是双向开口的,即在头尾插入和删除元素效率都很高,逻辑上deque的内存结构是这样的实际上,deque是用一个中控器map来管理这些连续的内存空间。map是一小块连续的空间,每个元素都是一个指针,指向连续的内存空间,指向的空间中存储的才是真正的deque的元素。2.deque容量操作函数功能bool empty()检查容器是否为空size_t size()返回容器中元素的个数size_t max_size()返回容器由于系统或库
2021-09-14 18:49:08
469
原创 C++ STL总结(一)顺序容器
一、顺序容器概述一个容器就是一些特定类型对象的集合,顺序容器为程序员提供了控制元素存储和访问顺序的能力,这种顺序不依赖与元素的的值,而是与元素加入容器时的位置相对应。STL顺序容器包含:vector:可变大小数组。支持快速随机访问,在尾部以外插入或删除可能很慢deque:双端队列。支持快速随机访问,在头尾插入和删除很快list:双向链表。只支持双向顺序访问。在任意位置插入和删除很快forward list:单向链表。只支持单向顺序访问,在任意位置插入和删除很快array:固定大小数组。支持快速
2021-09-14 18:47:34
670
原创 C++ STL总结(二)vector
1.vector内存结构vector在内存中是顺序存储的,但是为了防止插入元素后频繁重新分配内存,所以会预留一定空间,如图所示。但是,当预留空间用尽后,vector会重新申请一块更大的内存,并且将旧的内存中的数据全部拷贝到新的内存中,然后把旧内存返还给系统。2.vector容量操作函数功能bool empty()检查容器是否为空size_t size()返回容器中元素的个数size_t max_size()返回容器由于系统或库的实现所限制可容纳的元素最大数量
2021-09-14 18:45:00
936
原创 3、资源管理
条款13:以对象管理资源获得资源后立刻放进资源管理对象内 (Resource Acquisition Is Initialization RAII)管理对象运用析构函数确保资源被释放为防止资源泄漏,请使用RAII对象,它们在构造函数中获得资源并在析构函数中释放资源 两个常被使用的RAII class分别是tr1::shared_ptr和auto_ptr。前者通常是较佳选择,因为其copy行为比较直观。若选择auto_ptr,赋值动作会使它指向null 文中的auto_ptr已被C++11
2021-07-13 19:55:58
114
原创 2、构造/析构/赋值运算
条款05: 了解C++默认编写并调用了哪些函数当你自己没有编写时,编译器会默认为你的类创建defult构造函数、析构函数、拷贝构造函数和copy assignment操作符。如:class Empty{};实际上,相当于class Empty{public: Empty(){...} //defualt构造函数 Empty(const Empty& other){...} //copy构造函数 ~Empty(...) //析构函数 Empty& opreate=
2021-07-12 19:00:29
180
原创 FFMPEG支持NVIDIA
一、安装NVIDIA驱动安装方法在这里。二、ffmpeg编译参考这篇文章。1、下载ffmpg源码git clone https://git.ffmpeg.org/ffmpeg.git2、安装ffnvcodecgit clone https://git.videolan.org/git/ffmpeg/nv-codec-headers.gitcd nv-codec-headersmakesudo make install3、配置ffmpeg编译选项进入ffmpeg目录./confi
2021-07-08 11:32:18
933
原创 NVIDIA驱动安装(arm64平台可用)
一、下载驱动1、确定显卡型号使用lspci指令,查看自己的显卡型号xxxx:~$ lspci | grep NVIDIA10:00.0 3D controller: NVIDIA Corporation TU104GL [Tesla T4] (rev a1)可以看到,我的显卡是Tesla T4.2、去官网下载驱动访问nv官网,驱动下载,根据自己的显卡型号搜索对应的驱动注意不要选错操作系统了,我的是ARM平台的,选择的aarch64,然后点击搜索。可以看到驱动版本等信息,还可以从支持的
2021-07-08 11:18:53
8805
9
原创 Android Studio Cmake踩坑(option 设置不生效)
使用Cmake的同学都喜欢用option来控制编译选项,但是我做为初玩Android Studio的新手,用cmake时候却发现option选项设置一直不生效,所以来记录下踩坑记录。一、只编译一个abi时,option不生效设置了一个是否使用硬编码的选项。option(USE_HW_ENCODER "use the hw encoder" OFF)message("USE_HW_ENCODER is ${USE_HW_ENCODER}")Rebuild Project在.cxx/cmake/d
2021-06-23 17:52:12
3333
2
原创 Linux core dump调试
一 、什么是core dump直译为核心转储,实际就是程序运行崩溃时的内存快照,用来调试程序异常崩溃的工具。二、配置core dump1.开启core dump一般linux 默认是不开启Core dump的,可以通过ulimit -c 来查看,如果等于0就是没开启。如图所示:可以通过配置/etc/security/limits.conf文件来开启core dump。找到 soft core那行,解开注释。并配置value为你想要的数字,如图配置为500M。数字大小为core dump最大保存
2021-06-15 19:16:09
642
原创 Android APP以system权限运行
APP想要获取系统一些特殊权限时需要以system权限运行。本文对该方法进行介绍一、修改AndroidManifest.xml在package名字下面那行加入 android:sharedUserId=“android.uid.system”>并设置testOnly为false<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/and
2021-06-08 15:55:48
1861
1
原创 Cmake传入项目版本号
工程中经常需要设置版本号,如果总是手动去代码里改版本号就太麻烦了。所以可以选择使用CMake传输版本号。首先新建个config.h.in的文件内容如下#ifndef INCLUDE_GUARD#define INCLUDE_GUARD#define PROJECT_NAME "@PROJECT_NAME@"#define PROJECT_VER "@PROJECT_VERSION@"#define PROJECT_VER_MAJOR "@PROJECT_VERSION_MAJOR@"#d
2021-06-08 15:29:01
2022
原创 ffmpeg编解码指令
YUV2H264ffmpeg -y -f rawvideo -pix_fmt yuv420p -s:v 500x400 -r 25 -i ./test.yuv -f h264 output.h264h2642YUVffmpeg -i video.h264 -s 500x400 -pix_fmt yuv420p output.yuv
2021-05-13 16:48:28
746
原创 chrome浏览器安装markdown浏览插件
chrome本身是不支持markdown浏览的,打开.md文件,是长这样的然后,我们安装chrome的插件。在谷歌应用商店里,搜索Markdown.安装第二个Markdown Viewer。然后点击扩展选项->管理扩展程序->Markdown Viewer->详细信息使能允许访问文件网址然后就可以正常预览了...
2021-05-07 14:24:20
4624
3
原创 C++实现X11桌面录屏为H264文件
在C++实现X11桌面录屏为RGB文件一文中,我们已经实现将X11桌面录屏为RGB文件。本篇在此基础上利用ffmpeg将RGB编码为H264文件。一、编译FFMPEG+x264FFmpeg是一个是一个多媒体处理工具,但是原生的FFMPEG并不带有编码库。而x264是一个h264编解码的库,但是用起来没有ffmeg方便,所以需要我们下载ffmpeg的源码,并将x264编译进去。具体方法可以参考Linux FFmpeg编译支持aac、h264、h265二、使用ffmpeg进行编码直接上代码cpp/
2021-05-06 19:26:04
1196
原创 vmware Ubuntu虚拟机设置代理
1、虚拟机设置代理打开Ubuntu的设置,并点击Network->Network Proxy选择Manual,并填写代理地址。其中ip可以直接在主机上查看。要用VMware那个IP。2、VMware设置点击虚拟机->设置->硬件->网络适配器->NAT模式然后就可以google了。3 git设置代理git config --global http.proxy http://192.168.80.1:1080git config --global htt
2021-04-30 17:59:47
10830
9
原创 cmake C++11 undefined reference to `pthread_create‘
使用cmake 编译c++ 11及以上版本时,若使用多线程,则可能出现undefined reference to `pthread_create'在网上查了后都说pthread不是linux的默认库。最简单直接方法就是在cmake的CMAKE_CXX_FLAGS选项中加上pthread选项。et(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14 -pthread")...
2021-04-30 16:32:57
604
1
原创 Linux FFmpeg编译支持aac、h264、h265
1、下载ffmpeg源码直接从官网下载最新版git clone https://git.ffmpeg.org/ffmpeg.git2、安装aac、h264、h265库sudo apt-get install libfdk-aac-dev libx264-dev libx265-dev3、配置ffmpeg编译选项./configure --prefix="/usr/local" --pkg-config-flags="--static" --disable-asm --enable-gpl
2021-04-30 16:17:46
2857
4
原创 1、让自己习惯C++
条款01:视C++为一个语言联邦C++可以理解为四个次语言的结合:C。 基本的区块(blocks)、语句(statements)、预处理(preprocessor)、内置数据类型(build-in data types)、数组(arrays)、指针(pointers)等都来自于CObject-oriented C++。这部分是C with Class部分,包括:封装、继承、多态等古典面向对象设计守则。Template C++。这是C++泛型编程的部分,也是大多数程序员经验最少的部分。STL。容器
2021-04-17 16:57:15
143
输入法调研.pptx
2020-04-22
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人