自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(50)
  • 资源 (2)
  • 收藏
  • 关注

原创 h264编码原理

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

2022-04-14 06:44:14 4405

原创 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 5787

原创 创建 Android bks证书

需要创建密码,不然下一步会失败(未分析原因)1、使用公钥证书和私钥证书生成p12证书。tmp.p12 是目标生成文件p12证书。public.crt 是公钥证书;创建 Android bks证书。private.key 是私钥;2、将p12证书转成bks证书。

2024-03-18 15:29:28 272

原创 webrtc源码阅读之NACK

NACK(Negative Acknowledgement)机制是WebRTC中用于处理数据包丢失的重要机制。用于在数据包丢失时通知发送方重新发送丢失的数据包。当接收方检测到数据包丢失时,它会发送一个NACK消息给发送方,请求重新发送丢失的数据包。这种机制可以帮助提高通信质量和可靠性,尤其在不可靠的网络环境下。本文将从webrtc源码分析nack的实现,版本m98。

2023-07-17 17:27:11 441

原创 webrtc源码阅读之视频RTP接收&&JitterBuffer

在音视频通信中,网络抖动和延迟是常见的问题,会导致音视频质量下降和用户体验不佳。为了解决这些问题,WebRTC引入了Jitter Buffer(抖动缓冲区)这一重要组件。Jitter Buffer是一个缓冲区,用于接收和处理网络传输中的音频和视频数据。它的主要作用是解决网络抖动和延迟带来的问题,以提供更稳定和流畅的音视频传输。Jitter Buffer通过调整数据包的接收和播放时间,使得音视频数据能够按照正确的顺序和时序进行解码和播放。本文将从webrtc源码分析jitter buffer的实现,版本。

2023-07-14 13:53:51 2497

原创 webrtc源码阅读之h264 RTP打包

实时传输协议(RTP)是一个网络协议,它允许在网络上进行实时的音频和视频数据传输。RTP协议主要用于解决多媒体数据的实时传输问题,特别是对延迟和数据丢失敏感的应用。RTP协议包括两个紧密相关的部分:RTP数据协议和RTP控制协议(RTCP)。RTP数据协议负责数据的传输,RTCP负责监控服务质量并提供同步和标识信息。RTP协议并不保证数据的可靠传输,因为在实时应用中,比起保证数据的完整性,降低延迟和抖动更为重要。因此,RTP通常运行在不可靠的传输协议(如UDP)之上。

2023-07-05 16:17:29 1429

原创 webrtc源码阅读之视频采集、编码、发送

在examples/peerconnection源码阅读中,我们有个关键函数,在这个函数中会先Create一个video track,然后把这个track add到peerconnection中。从而进行视频采集、编码和发送。

2023-06-30 09:09:48 746

原创 webrtc源码阅读之P2P流程分析

本文我们从Offer端的角度进行源码分析,学习webrtc是如何进行P2P连接的。版本m98。

2023-06-28 14:08:26 817

原创 webrtc源码阅读之examples/peerconnection

阅读webrtc源码,从examples中的peerconnection开始。

2023-06-27 09:02:11 853

原创 AndroidStudio jni C++与Java互相调用

jni C++与Java互相调用

2022-08-16 17:38:07 1562 1

原创 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 1227

原创 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 724 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 1230

原创 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 832

原创 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 1171 1

原创 2 live555源码分析(二)——live555 基础运行环境

一、基础组件总览本篇开始分析live555的基础组件,也就是基础运行环境所需要的组件类。UasgeEnvionment相关类的关系如下图所示UsageEnvironment类是个抽象类,提供基础的运行环境,它依赖于TaskScheduler类来进行任务的调度。BasicUsageEnvironment0继承自UsageEnvironment,是对UsageEnvironment的初步实现,但是也是个抽象类,真正的实现在BasicUsageEnvironment类。BasicUsageEnviron

2021-10-22 10:58:20 783

原创 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 3482 1

原创 C++ STL总结(六)string

一、顺序容器概述一个容器就是一些特定类型对象的集合,顺序容器为程序员提供了控制元素存储和访问顺序的能力,这种顺序不依赖与元素的的值,而是与元素加入容器时的位置相对应。STL顺序容器包含:vector:可变大小数组。支持快速随机访问,在尾部以外插入或删除可能很慢deque:双端队列。支持快速随机访问,在头尾插入和删除很快list:双向链表。只支持双向顺序访问。在任意位置插入和删除很快forward list:单向链表。只支持单向顺序访问,在任意位置插入和删除很快array:固定大小数组。支持快速

2021-09-15 19:12:39 304

原创 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 2425 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 489

原创 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 380

原创 C++ STL总结(一)顺序容器

一、顺序容器概述一个容器就是一些特定类型对象的集合,顺序容器为程序员提供了控制元素存储和访问顺序的能力,这种顺序不依赖与元素的的值,而是与元素加入容器时的位置相对应。STL顺序容器包含:vector:可变大小数组。支持快速随机访问,在尾部以外插入或删除可能很慢deque:双端队列。支持快速随机访问,在头尾插入和删除很快list:双向链表。只支持双向顺序访问。在任意位置插入和删除很快forward list:单向链表。只支持单向顺序访问,在任意位置插入和删除很快array:固定大小数组。支持快速

2021-09-14 18:47:34 581

原创 C++ STL总结(二)vector

1.vector内存结构vector在内存中是顺序存储的,但是为了防止插入元素后频繁重新分配内存,所以会预留一定空间,如图所示。但是,当预留空间用尽后,vector会重新申请一块更大的内存,并且将旧的内存中的数据全部拷贝到新的内存中,然后把旧内存返还给系统。2.vector容量操作函数功能bool empty()检查容器是否为空size_t size()返回容器中元素的个数size_t max_size()返回容器由于系统或库的实现所限制可容纳的元素最大数量

2021-09-14 18:45:00 786

原创 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 83

原创 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 117

原创 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 796

原创 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 5936 8

原创 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 2445 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 483

原创 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 1533 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 1650

原创 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 670

原创 chrome浏览器安装markdown浏览插件

chrome本身是不支持markdown浏览的,打开.md文件,是长这样的然后,我们安装chrome的插件。在谷歌应用商店里,搜索Markdown.安装第二个Markdown Viewer。然后点击扩展选项->管理扩展程序->Markdown Viewer->详细信息使能允许访问文件网址然后就可以正常预览了...

2021-05-07 14:24:20 4179 2

原创 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 1039

原创 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 9060 6

原创 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 545 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 2294 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 112

原创 git push 413问题及git设置ssh提交

Enumerating objects: 342, done. Delta compression using up to 8 threads Total 298 (delta 46), reused 0 (delta 0) RPC failed; HTTP 413 curl 22 The requested URL returned error: 413 the remote end hung up unexpectedly the remote end hung up unexpectedly网

2021-03-30 13:39:13 889

原创 SDL播放RGB原始数据

上一篇我们实现了将X11桌面录屏为原始的RGB图像数据,那么这样的数据如何播放呢?这篇文章我们将介绍如何用SDL播放原始RGB数据。SDL简介SDL库就是一个封装了复杂的音视频底层操作的库,用C语言编写,跨平台。SDL数据结构简介:SDL_Window 代表了一个“窗口”SDL_Renderer 代表了一个“渲染器”SDL_Texture 代表了一个“纹理”SDL_Rect 一个简单的矩形结构SDL视频显示流程代码#include <memory>#include &

2021-03-23 10:36:59 626

NVIDIA显卡驱动安装.txt

Linux(Ubuntu、centos)下NV驱动安装指南

2021-04-29

输入法调研.pptx

linux输入法开发调研及开发架构。本PPT调研了linux输入法开发的现状,并分析了以fcitx(小企鹅)为输入法框架的输入法开发架构,希望对同仁有所帮助

2020-04-22

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除