- 博客(252)
- 资源 (7)
- 收藏
- 关注
原创 HM编码器代码阅读(46)——SAO总结
SAO总结理论HEVC/H.265理论知识(7)——环路滤波代码解读HM编码器代码阅读(27)——样点自适应补偿SAO(一)SAO介绍以及入口函数HM编码器代码阅读(43)——样点自适应补偿SAO(二)收集像素块的统计信息HM编码器代码阅读(44)——样点自适应补偿SAO(三)选取最优的SAO模式并确定补偿值HM编
2017-02-22 21:25:39 2139 1
原创 HM编码器代码阅读(40)——帧内预测的总结
帧内预测的总结原理HEVC/H.265理论知识(3)——帧内预测代码实现HM编码器代码阅读(34)——帧内预测(一)HM编码器代码阅读(35)——帧内预测(二)帧内预测总流程HM编码器代码阅读(36)——帧内预测(三)帧内预测之参考像素块的预处理和滤波HM编码器代码阅读(37)——帧内预测(四)帧内预测之候选模式列表的建立HM
2017-02-17 21:30:07 3518 1
原创 HM编码器代码阅读(33)——帧间预测的总结
原理理论介绍:HEVC/H.265理论知识(4)——帧间预测AMVP模式HM编码器代码阅读(13)——帧间预测之AMVP模式(一)总体流程HM编码器代码阅读(14)——帧间预测之AMVP模式(二)predInterSearch函数HM编码器代码阅读(15)——帧间预测之AMVP模式(三)xGetBlkBits函数HM编码器代码阅读(16)——帧间预测之AMV
2017-02-16 21:59:27 5142 1
原创 实时音视频之toy_rtc(6)——网络模拟器
介绍 为了模拟弱网环境,在测试的时候需要使用弱网工具制造各种各样的弱网场景。常见的弱网工具有TC等。toy_rtc里面简单的实现了一个弱网模拟器。包含的功能模拟丢包模拟延迟模拟抖动模拟带宽限制实现随机数产生器#ifndef RANDOMGENERATOR_H#define RANDOMGENERATOR_H/* * 随机数产生器 */#include <r...
2019-12-04 21:57:28 604
原创 实时音视频之toy_rtc(5)——序列化工具
把数据发送到网络上之前需要对它进行序列化;从网上收到数据时要对它进行反序列化操作。 下面写了一个简单的序列化工具类#ifndef MARSHALL_H#define MARSHALL_H#include <vector>#include <assert.h>#include <stdlib.h>#include <stdio.h>...
2019-12-04 21:47:09 496
原创 实时音视频之toy_rtc(3)——接口定义
收包接口 用来从网络上接收数据包 // 包接收器 class IPacketReceiver { public: virtual ~IPacketReceiver() {} virtual void on_recv_media_data(const uint8_t* data, size_t size) = 0; virtual void on_recv_signa...
2019-12-04 21:31:40 501
原创 实时音视频之toy_rtc(4)——定义传输协议
项目地址: https://github.com/mobinsheng/toy_rtc本项目并没有直接使用RTP、RTCP协议。这是因为toy_rtc本身就不是按照标准RTC去开发的,因此为了方便扩展,自己实现了传输协议。这带来了一个坏处,包头占比比较大,会浪费带宽,在低带宽场景下比较受限。信令包的结构如下:[ network_packet_head | app_packet_head...
2019-12-04 20:21:44 372
原创 实时音视频之toy_rtc(2)——类型定义
包类型:信令包视频包音频包rtx包,包括重传包和padding包enum RtcPacketType { kPacketApp, kPacketVideo, // video frame kPacketAudio, // audio frame kPacketRtx, // include ARQ packet and Padding packet};视频帧...
2019-12-04 20:21:32 324
原创 实时音视频之toy_rtc(1)——介绍
做实时音视频开发已经两年时间了,从开始的一窍不通(只了解一点视频编码知识),到现在刚摸到实时音视频的一点门槛,花了很多时间在这上面,相比于其他技术,实时音视频的门槛很高,技术栈很广而且很深,资料也很少,要想入门确实要花大力气。这两年内我做过的内容包括:服务端转码视频jitter bufferNack/ARQBBR模块的移植引擎库线程模型重构FEC性能优化音画同步音视频订阅媒体...
2019-12-04 20:20:52 538
原创 webrtc的source、track和stream
media stream是track的集合(即track的容器)source是track的输入一个sender或者receiver对应于一个track,它们负责track的发送或者接收
2019-12-04 10:35:28 1674
原创 使用FFmpeg解码H264
接口定义使用FFmpeg解码之前,先定义一些接口:打开解码器:Open关闭解码器:Close解码:Decode根据上面的定义,可以使用C++来抽象出一个虚基类namespace toy { class VideoDecoder { public: struct Setting { // TODO }; virtual ~VideoDecoder() {};...
2019-12-03 22:16:04 672
原创 使用x264进行视频编码
定义接口在实现x264编码之前,我们先定义一些常用视频编码接口:打开编码器:Open关闭编码器:Close配置编码器:Configure或者ReConfigure获取编码器配置信息:GetConfig编码:Encode请求关键帧:ForceKeyframe根据上面的定义,可以使用C++来抽象出一个虚基类namespace toy { // 编码器基类 class Vide...
2019-12-03 21:53:45 1751 2
原创 使用openh264进行视频编码
先定义编码器类型 // 编码器类型 enum VideoCodecType { kVideoCodecGeneric = 0, kVideoCodecVP8, kVideoCodecVP9, kVideoCodecH264, kVideoCodecI420, kVideoCodecMultiplex, };定义编码器基类namespace toy { ...
2019-12-03 21:12:02 4206 1
原创 使用异或操作抵抗网络丢包
数据丢失常见的恢复方法假设有一个客户端和一个服务器,客户端和服务器通过网络连接,但是这个网络很不稳定,可能会出现丢包,那么怎么样才能在服务器端恢复那些丢失的数据呢。通常有两种做法:通知客户端重传丢失的数据。客户端根据原始数据生成一组冗余数据,然后把原始数据和冗余数据一起发送给服务器,只要丢失的数据量不超过阈值,服务器就可以根据未丢失的原始数据和冗余数据来恢复那些丢失的原始数据。本文介绍...
2019-12-03 16:52:03 559
原创 C++同步队列
本文实现了一个带锁同步队列,可以让多个线程向队列里读写数据而不会产生异常,很方便的应用于生产者消费者模式的程序中同步队列没什么难的,无非就是读写的时候加锁,并且写入的时候通知消费者。稍微复杂的地方在于怎么样让生产者消费者停止运行,或者说,怎么才能让同步队列退出;因为一般的应用不可能无限运行下去,它总有停止的时候,当应用程序退出的时候,我们需要告诉生产者和消费者这个消息。我的做法是这样的,...
2019-08-19 20:01:14 1225
原创 webrtc(1) 信号槽sigslot
信号槽sigslot 信号槽的作用 webrtc中有一个重要基础组件——信号槽,它和qt中的信号槽类似,它以发送信号的方式分离调用者和被调用者,达到耦合的目的。另外,webrtc中的信号槽是线程安全的。信号槽的用法 #include "sigslot.h"#include <string>using namespace std;using na...
2018-04-19 14:34:56 1123
原创 x264动态改变参数
x264动态改变参数1、在编码的过程中经常会遇到需要改变编码参数的情况,比如切换分辨率,码率等2、有的参数可以在运动时动态修改;有的参数则必须在open之前设定,如果需要修改就必须要先关闭编码器然后重新打开3、下面我们来看一下哪些参数可以动态修改,动态修改编码参数的入口函数是x264_encoder_reconfig,它实际上封装了对x264_encoder_try
2017-10-31 10:25:25 2253
原创 x264帧内预测
X264 帧内预测理论1、 宏块大小是 16x16,每个宏块包含一个 16x16 大小的亮度块和两个 8x8 的色度块2、亮度分量对于亮度分量而言,帧内预测只针对 16x16 的块或者 4x4 的小块,换句话说,对于亮度分量而言,进行帧内预测的时候,它只能被划分为 16x16(即不进行划分)的块,或者 4x4 的小块。2.1、16x16 亮度块有 4 种帧内预测
2017-10-30 19:32:10 1638
转载 ffmpeg 的时间
1、名词解释:PTS:播放时间戳DTS:解码时间戳注意:如果没有 B 帧,那么 PTS 和 PTS 是一样的2、音视频流中有一些信息表明了,音视频以多快的速度播放,音频是采样率,视频则是帧率3、ffmpeg 中的时间单位AV_TIME_BASE:ffmpeg 的时间单位,也叫做时间基。ffmpeg 中的时间单位不是秒,而是AV_TIME_BASE,所有的时间都是以他为单
2017-10-27 20:52:37 980
原创 x264比较重要的参数
x264核心参数x264有若干参数对编码速度和编码质量影响很大,对x264的优化有重要参考意义。核心参数1这类参数通过preset的相关设置来解读 这些参数主要影响编码速度和比特率以及视频质量,涉及的参数有:/* 参考帧数量*/frame_reference/* 场景切换设置阈值*/scenecut_threshold/* 是否进行去方块滤波*/
2017-10-27 13:49:44 7930
原创 x264的preset和tune
x264的preset和tunepresetpreset是x264中最重要的选项,它影响编码性能和编码速度,它由不是一个单一的参数,而是由一组参数构成。preset分为下面几种类型:static const char * const x264_preset_names[] = { "ultrafast", "superfast", "veryfast", "faster", "
2017-10-27 12:23:11 6329
原创 x264设置默认参数
x264通过代码设置默认参数void x264_param_default( x264_param_t *param ){ /* */ memset( param, 0, sizeof( x264_param_t ) ); /* CPU autodetect */ /* 自动检测cpu的数量 */ param->cpu = x264
2017-10-27 11:22:42 943
原创 x264的命令行参数
x264的命令行参数x264 core:148Syntax: x264 [options] -o outfile infile Infile can be raw (in which case resolution is required), or YUV4MPEG (*.y4m), or Avisynth if compiled with support
2017-10-27 11:19:51 2681
原创 x264_param_t 详解
x264的x264_param_t结构typedef struct x264_param_t{ /* CPU flags */ unsigned int cpu; /* 并行线程的数量,即同时被编码的图像的数量,增加线程数量会影响编码速度, * 同时也会影响编码延迟(所谓编码延迟就是 编码器中得到第一个输出时已经往输入的帧数) */ in
2017-10-27 11:16:05 2279 1
原创 可以通过ffmpeg设置的Intel Qsv参数
QSV参数"async_depth","Maximumprocessingparallelism""avbr_accuracy","AccuracyoftheAVBRratecontrol","avbr_convergence","ConvergenceoftheAVBRratecontrol""preset""veryfast"
2017-10-27 11:08:59 6330 1
转载 pkg-config的作用
有些时候你的工程会用到第三方库,比如你会用到一个叫libxxx库,,编译和安装后,你通常会在/usr/local/lib 和/usr/local/include/ 目录下发现有xxx/目录,但是很多时候你在代码中引用libxxx库的头文件时,声明如下:#include 你的代码写好后,你编译时会出现:fatal err
2017-10-24 11:18:56 556
转载 x264学习(2)——x264命令行参数解释
原文地址:http://blog.csdn.net/liuchen1206/article/details/44174741词汇翻译:macroblock:宏区块。是一种图像压缩的术语。宏区块是运动预测的基本单位,一张完整的图像(frame)通常会被切割成几个宏区块。h.264 的宏区块大小是可变的,常用 16x16 pixels。帮助X264 内置帮助文档。运行 x2
2017-08-08 20:54:04 2555
转载 x264学习(1)——简述x264几种码率控制方式的实现
原文地址:http://blog.sina.com.cn/s/blog_784448d60101017t.htmlx264的码率控制是基于libavcodec和经验的。这篇文章将尝试说明复杂的码率控制算法背后的理论基础。几点理论1、固定质量并不等价于PSNR或QP完全恒定。复杂场景或者高速场景中难以辨别的细节会被选择性省略,以节省空间;2、如果运动预测生效,将获得更
2017-08-08 20:50:42 800
原创 HEVC多次进行熵编码的原因
HEVC多次进行熵编码的原因 在HM中有个让人很疑惑的地方,就是熵编码会被多次调用 1、compressSlice中有两次 (1)第一次是compressCU中,使用熵编码来进行RDO优化,用来选择最优的编码参数 (2)第二次是紧接着compressCU后面调用了encodeCU 2、encodeSlice中有一次
2017-05-08 17:05:25 3010 3
原创 HEVC中的CABAC
HEVC中的CABAC CABAC(上下文自适应的二进制算术编码)基于算术编码,在HEVC中,除了参数集、SEI和slice头部之外,其余的所有数据都使用CABAC来进行熵编码。 CABAC有三个步骤: 1、初始化,构建上下文概率模型 2、根据上下文概率模型获取语法元素的概率,对语法元素进行熵编码 3、根据编码结果更新上下文概率模
2017-05-07 22:31:16 6618 1
原创 HEVC中的CAVLC
HEVC中的CAVLCCAVLC 基于上下文的自适应变长编码首先,HEVC的熵编码使用了两种算术编码:CABAC和CAVLC。CAVLC主要用于编码SEI、参数集、片头等,剩下的所有数据和语法元素均使用CABAC来编码。HEVC标准文档中使用到的一些描述符(描述符也表示操作方法):1、ae(v) 使用cabac2、b(8) 读进连续的8 bit3
2017-05-05 17:45:58 2119
原创 CU的划分、地址以及索引
CU的划分、地址以及索引 在看HM源码的时候,最蛋疼的一件事就是被CU的划分以及它们的地址搞懵。为了搞清楚,仔细研究了一下源码,有什么错误请指出。为了弄清楚这个问题,必须要对扫描顺序、深度等概念有所理解。扫描顺序 HEVC中对像素块的扫描方式有两种:Raster和Zscan Raster扫描方式:从上到下,从左到右进行扫描,
2017-05-04 21:54:44 5283
原创 TComPicYuv、TComPic、TComPicSym、TComDataCU以及TComYuv的关系
TComPicYuv、TComPic、TComPicSym、TComDataCU以及TComYuv的关系首先用一张图来描述它们之间的关系1、HM首先使用TComPicYuv保存从文件中读取出来的YUV数据2、利用TComPicYuv构造TComPic,并把YUV数据复制给他(TComPic包含了TComPicYuv成员)3、TComPic表示一帧图像,包含了
2017-05-04 18:06:11 5353 5
原创 HEVC解码器HM源码阅读(四)解析参数集
解析视频参数集VPS 得到如果NALU的装的是VPS,那么需要从NALU中把VPS解析出来,VPS包含了全局使用的一些信息,包含Profile、Level、Tier、时域层信息、TimingInfo、HRD等等 解析VPS的入口函数 1、创建VPS对象 2、解析VPS 3、把VPS放入参数集管理器中Void TDecTo
2017-05-02 21:14:12 1990
原创 HEVC解码器HM源码阅读(三)读取一个NALU
读取一个NALU视频数据的两种存储传输方式视频的压缩数据,有两种存储传输方式:1、存放在本地文件中,就是所谓的字节流应用(本章节讨论),也就是我们常说的比特流。2、把数据发送到网络上,就是所谓的分组流应用(涉及到RTSP、rtmp等等封装协议,这里不细讲)。NALU和比特流之间的关系常见的比特流如下图所示:1、NALU按照顺序
2017-05-02 20:00:01 2577
原创 HEVC解码器HM源码阅读(二)解码器中类的介绍
解码器中类的介绍(***未完待续****) HM解码器包含了下面的类: program_options_lite:参数解析 TAppDecCfg:解码器基础配置 TAppDecTop:解码器应用程序,代表了整个编码器 TDecTop:解码器内核,它是解码器最关键的部分,以汽车作为例子,TAppDecTop表示一辆汽车,那么TDe
2017-05-02 19:24:50 1324
原创 HEVC解码器HM源码阅读(一)介绍
HEVC解码器HM源码阅读(一)介绍之前看HM的编码器,总觉得理解得不够深入,很多地方只是了解大概的处理流程,具体含义没有理解。为了更加深入理解HEVC,现在开始从解码器的角度分析HEVC,说不定能够取得不错的效果。HM解码器包含的工程TAppDecoder:解码器入口(APP表示应用程序)TAppCommon:参数解析TLibCommon:公用的库(和编码器共
2017-05-02 17:52:58 2838
原创 硬件编解码(八)其他资料的搜集
Intel Media SDK方面的博客http://blog.csdn.net/jammg/article/details/52798434http://blog.csdn.net/ww506772362/article/category/2705037
2017-03-06 15:16:46 945
转载 硬件编解码(七)【Intel(R)_Media_SDK】官方文档翻译摘要
转载一个大神翻译的Intel Media SDK官方文档原文地址:http://blog.csdn.net/jammg/article/details/52798434【前言】Intel media SDK调用系统底层库完成硬编解码,处理视频,库分用器如下有很多硬解码库,不同的GPU可以使用不同的库,有些库也有
2017-03-06 15:14:13 6158
原创 硬件编解码(七)Intel提供的QuickSync使用样例(4)视频编码
视频编码编码的流程流程如下:1、一些初始的相关设置2、进入第一个while循环(1)获取一个空闲的任务(2)获取输入缓存区(3)读取一个帧(4)如果有需要就调用RunFrameVPPAsync,对让视频预处理器(vpp)对视频进行处理,注意它是一个异步函数(5)调用EncodeFrameAsync对帧进行编码,注意它也是一个异步函数,这意
2017-03-06 15:09:51 4714 2
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人