自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(35)
  • 资源 (4)
  • 问答 (1)
  • 收藏
  • 关注

原创 最简单的视频P帧编码的C++实现

一、前言本篇博客尝试动手实现一个简单的P帧编码。二、主要实现:参考图像P1,欲编码图像P2,通过在P1中去进行宏块匹配,来拼凑出图像P3,最后在对编码出的图像P3进行残差补偿来完成简单的图像编码,得到编码后图像P4。整体上只简单的应用了帧间编码的思想。三、运行结果1. 参考图像P1这帧图像就是我们在编码中的参考帧,大多数情况下为I帧。通常情况下参考帧的数量不会是只有1个。2 欲编码图像P2这帧图像就是我们想要进行编码的图像的源图像。3 宏块匹配拼凑出的图像P3把参考帧P1和欲编码帧P

2020-08-26 15:42:44 2459

原创 基于FFmpeg4.1的视频播放器的极简实现(音视频学习笔记四)

前言这篇文章记录一个简单视频播放器的开发过程,代码极其为简洁,基于ffmpeg最新版本4.1实现的。视频渲染用的SDL2.0,SDL视频渲染部分代码直接copy的雷神的最简单的基于FFMPEG+SDL的视频播放器 ver2 (采用SDL2.0)但是他这篇的代码对于高版本的ffmpeg已经不适配了。运行结果测试视频是在Best Place on the Web to Download HD Trailers下载的电影宣传片,1080p的,下面是播放的画面。log记录,打印log方便调试程序,另外这

2020-08-08 21:17:36 550

原创 WIn7 SDK不支持TLS1.1/TLS1.2协议( BUG记录1)

win7 系统tls协议

2022-12-19 20:55:34 1670

原创 【unix】多线程(1)

多线程基础函数

2022-12-19 20:41:55 397

原创 之字形打印二叉树

vector<vector<int> > Print(TreeNode* pRoot) { vector<vector<int>> result; if(pRoot) { stack<TreeNode* > stack_odd,stack_even;//二叉树的奇数行和偶数行。 //奇数上从左往右打印,则入栈顺序是右、左,偶数入栈顺序是左、右 .

2021-07-05 16:59:42 147

原创 笔试题—最长回文字符串

扩散法,需要考虑长度为偶数和奇数的情况int getLongestPalindrome(string A, int n) { // write code here if (n <=1)return A.length(); int left = 0, right = 0, longest = 1; //以每个字符为中心开始扩散。 for (int i = 0; i < n; i++) { left = right = i;

2021-07-05 15:18:55 121

原创 HEVC学习(十三)TComPicYuv的数据转换成Mat格式

TComPicYuv中获取尺寸参数以及YUV数据Int getWidth (const ComponentID id) const { return m_picWidth >> getComponentScaleX(id); }Int getHeight (const ComponentID id) const { return m_picHeight >> getComponentScaleY(i

2021-06-08 11:33:39 351

原创 HEVC学习(十二)—参考帧管理代码追踪

参考帧初始化函数1、xInitRPS()函数xInitLib()内部初始化了SPS、VPS、PPS、RPS。参考帧集合初始化函数主要是RPS的初始化函数xInitRPS();- 代码追踪Void TEncTop::xInitRPS(TComSPS &sps, Bool isFieldCoding){ //参考图像集合rps TComReferencePictureSet* rps; //rpsList 中包括getGOPSize() + m_extraRPSs + 1

2021-06-04 11:09:59 1098 2

原创 HEVC学习(十)HM16.20划分Tiles配置

默认配置,没有Tiles#============ Tiles ================TileUniformSpacing : 0 # 0: the column boundaries are indicated by TileColumnWidth array, the row boundaries are indicated by TileRowHeight array

2021-05-10 10:38:22 480

转载 HEVC学习(九)在ubuntu下编译运行HEVC参考软件HM-16.20

在ubuntu下安装svn转载【在ubuntu下编译运行HEVC参考软件HM-16.20】sudo apt-get install subversion使用svn去下载参考软件HM2.1先创建一个空文件夹,命名为HM2.2使用terminal进入HM文件夹,在该文件夹下输入svnserve -d -r ./指定svn在本机服务器的位置2.3 接着在terminal中输入svn checkout https://hevc.hhi.fraunhofer.de/svn/svn_HEVCSoftwar

2021-05-10 10:21:45 559

原创 HEVC学习(八)FFMpeg裁剪和拼接YUV序列命令

测试需要,需要将一个600帧的YUV切成九块,如下所示裁剪成下面的样子,如:这里是引用

2021-05-10 10:18:25 1167

原创 大型铁路监控视频播放客户端(安卓端)简介。

开发中截图,项目除美工外前端页面代码后端播放代码全权由我完成,集成了软硬解码、截图、录像等功能,基于FFmpeg在android上实现。

2021-04-23 16:44:42 127

转载 HM中一些比较容易混淆的类和结构

本文转载自:NB_vol_1TcomPic 是图片类,它包含TComPicSym(图像符号类)和TComPicYuv(yuv数据类:包括原始数据,预测数据、残差数据)TvideoIOYuv 是用来读取yuv文件的类,读取出来之后把数据放到TComPicYuv中TComPicSym中则存放了指向片(TComSlice)的二级指针,和指向CU(TComDataCU)的二维指针,其实片和CU的实际数据仍然存放在TComPicYuv中TEncEntropyIf是熵编码算法的纯虚类TEncSbac(T

2021-04-16 15:21:04 213

原创 HEVC学习(七)HM16 TComPicYuv::extendPicBorder ()解析

这个函数是填充原始YUV边缘的函数。源码:Void TComPicYuv::extendPicBorder (){//判断是否填充过 if ( m_bIsBorderExtended ) { return; } for(Int comp=0; comp<getNumberValidComponents(); comp++) { const ComponentID compId=ComponentID(comp); Pel *piTxt=getAdd

2021-04-11 10:55:16 259

原创 HEVC学习(六)HM16 TComPicYuv类解析

类TComPicYuv是负责保存和表示从文件中读取的YUV数据。TComPicYuv.h,已经做了部分注释。class TComPicYuv{private: // ------------------------------------------------------------------------------------------------ // YUV buffer // ---------------------------------------------.

2021-04-11 09:43:48 528 2

原创 HEVC学习(五)HM获取参考像素函数fillReferenceSamples()

本文参考:https://blog.csdn.net/HEVC_CJL/article/details/8175721函数:fillReferenceSamples()Void fillReferenceSamples( const Int bitDepth, #if O0043_BEST_EFFORT_DECODING const Int bitDepthDelta, #endif cons

2021-04-10 14:02:07 247

原创 HEVC学习(三)HM16 predIntraGetPredValDC()函数详解

初学者,如有错误请批评指正。截取的代码Pel TComPrediction::predIntraGetPredValDC( const Pel* pSrc, Int iSrcStride, UInt iWidth, UInt iHeight){ assert(iWidth > 0 && iHeight > 0); Int iInd, iSum = 0; Pel pDcVal; //获取上面的参考像素 for (iInd = 0;iInd < iWi

2021-04-09 22:23:30 193

原创 HEVC学习(二)HM16.20各种配置编码码率比较记录

素材hall_cif.yuv1 encoder_lowdelay_P_main.cfg2 encoder_intra_main.cfg3 encoder_lowdelay_main.cfg码流对比 I>I\P>I\B编码时间对比 I\B>I\P>I

2021-03-06 10:17:34 710 1

原创 HEVC学习(一)测试视频序列地址

YUV测试视频序列地址http://trace.eas.asu.edu/yuv/需要VPN才能下载,下载下来的视频是YUV格式。HM官方测试视频序列地址ftp://ftp.kw.bbc.co.uk/hevc/hm-10.0-anchors/bitstreams/ra_main/需要VPN才能下载,下载下来的是bin格式,需要解码才能成YUV格式。...

2021-01-29 09:33:14 1078

原创 (linux系统)用户数据信息获取getpwuid、getspnam

根据用户名区验证用户名密码是否正确函数说明The getpwnam() and getpwuid() functions return a pointer to a passwd structure, or NULL if the matching entry is not found or an error occurs. If an error occurs, errno is set appropriately. If one wantsto check errno aft

2020-10-21 11:04:17 579

原创 (linux系统)获取目录及目录下文件所占磁盘大小

运行结果代码#include<stdio.h>#include<stdlib.h>#include <sys/types.h>#include <sys/stat.h>#include <unistd.h>#include <glob.h>#include <string.h>#define PATHSIZE 1024static int path_noloop(const char * path

2020-10-21 10:53:00 280

原创 (linux系统)时间戳函数example

函数说明1.time():get time in seconds from 1970-01-01 00:00:00 +0000 (UTC).原型: time_t time(time_t *tloc);2.localtime():transform date and time to broken-down time or ASCII原型: **struct tm localtime(const time_t timep);3.strftime() :format date and time原

2020-10-21 10:46:19 358

原创 标准IO操作基础函数基本使用

fopen()说明fopen, fdopen, freopen - stream open functions#include <stdio.h>FILE *fopen(const char *pathname, const char *mode);例子1#include<stdio.h>#include<stdlib.h>#include<errno.h>#include<string.h>int main(){

2020-10-14 10:24:35 246

原创 多种方法实现背景建模(基于opencv)

原理简单记录,原理即为Num帧图像相加,最后除以Num即为均值背景建模法。API//opencv的累加函数void accumulate( InputArray src, InputOutputArray dst, InputArray mask = noArray() );结果(200帧均值)代码:#include<stdio.h>#include<iostream>#include<list

2020-09-02 15:36:49 885

原创 tiny_jpeg.h编码JPEG图像源码注释

前言tiny_jpeg.h代码只有1000+行,可读性比较强, 不像libjpeg那么繁琐。想要读懂tiny_jpeg的压缩源码还需要对JPEG文件格式有比较详细的理解,这里推荐一篇博客《jpeg图片格式详解》不熟悉的可以去看一下。源代码main()函数,这里用了一个源文件stb_image.h可以去github上下载int main(){ int width, height, num_components; unsigned char* data = stbi_load("i

2020-08-31 18:21:43 1561

原创 C/C++线程池的简单实现

前言代码来自与“零声学院”线程池实现的公开课,本来是运行在linux系统下的,这里把代码做了一点点修改,可以vs直接运行,这里做了详细的注释,方便后续查阅。运行结果前面是任务,写数字,后面是线程ID,线程自动的从任务队列里拿到任务去执行,没有任务则等待。可以看到有ID:13012线程连续执行了两次,每个线程执行完一个任务后会继续的读取在任务队列里读取任务。源代码#include <stdio.h>#include <stdlib.h>#include <stri

2020-08-27 22:20:13 259

原创 C++实现视频按帧保存成图片(基于opencv4)

opencv读取视频,把你需要的帧保存成图片,这里每30帧保存一张jpg图片,直接上代码:代码#include<stdio.h>#include <sstream>#include<opencv2/video.hpp>#include<opencv2/core.hpp>#include<opencv2/highgui.hpp>using namespace cv;/** 从视频中裁剪出图片,要求图片是灰度图即只有Y分量。*/i

2020-08-25 10:12:33 2997 1

原创 FFmpeg测试视频的实时码流(音视频学习笔记五)

前言这篇博文记录一个简单的实时码流测试程序,事实上FFmpeg打开媒体文件后就可以获得整个视频的平均码流**(只计算视频码流**),但是无法获取实时码流,因为后面的工作需要对编解码做一些优化,需要实时观测码流,这里先实现一个比较简单的版本。运行结果事实上h264编码的视频的码流还是比较平缓的,在视频较暗或者视角相对固定的时候可以观测到码流稍有下降。这里单位用Mbps。可以观测到实时码率,大家也可以用这款软件Elecard StreamEye来观测实时码流,如下图:蓝色的曲线就是码流的实时曲线。

2020-08-13 19:52:49 2069 1

原创 C++多线程实现解封装和解码的解耦合(基于FFmpeg4.1)

这篇博客记录一下使用多线程来对FFmpeg的demux模块和decode模块的降耦合,解封装和解码各自单独占用一个线程,正常来讲音频解码和视频解码应该各自占用一个线程,在这里为了简单就把他们合并为了一个线程,没加入视频和音频的渲染,读者可以根据情况自行添加。运行效果:- 启动之后两个线程成功进入,在媒体文件读取结束后安全停止线程。所有的文件示意图:下 面我会一一进行介绍。XThread类:线程函数的基类,解封装模块和解码模块分别对其进行继承。IDemux类:解封装模块的接口类,对XThre

2020-08-12 21:39:52 648

原创 FFmpeg解码错误: No start code is found,Error splitting the input into NAL units.解决办法。

错误[h264 @ 000001549d341740] No start code is found.[h264 @ 000001549d341740] Error splitting the input into NAL units.1. 错误代码:AVCodec* vcodec = avcodec_find_decoder(ifmt->streams[video_index]->codecpar->codec_id);AVCodecContext* vctx = avco

2020-08-08 20:05:52 11189 7

原创 C++实现flv封装格式解析(音视频学习笔记三)

这篇博文使用C++按字节的读取一个flv文件信息,对其中一些重要的信息进行log输出,对flv的数据封装格式信息不清楚的可以去看这篇博文-FLV 封装格式解析,里面详细说明了flv文件的结构信息。这篇博文参考了雷霄骅博士的视音频数据处理入门:FLV封装格式解析的部分代码。flv封装格式简要概述flv文件主要有FLV Header和FLV BODY两部份组成,借用FLV 封装格式解析中的一张图进行说明:FLV BODY中back-point与TAG结构交织存储,其中back-point也即图片

2020-08-07 12:45:32 884 1

原创 音视频封装格式转换器(支持avi格式转换),基于FFmpeg4.1实现(音视频学习笔记二)

参照雷霄骅博士的最简单的基于FFMPEG的封装格式转换器(无编解码)的博客和FFmpeg官网的example,实现一个简单的封装格式转换器。先上结果图:这个程序可以实现各种封装格式转换,对于有字幕流的视频进行了字幕流剔除。代码注释比较详细,直接上代码:#include<iostream>extern "C"{#include<libavutil/timestamp.h>#include<libavformat/avformat.h>}int main(i

2020-08-05 22:26:10 1599

原创 最简单的音视频解封装器,基于FFmpeg4.1实现(音视频学习笔记一)

最简单的音视频解封装器,基于FFmpeg4.1实现最近在学习FFmpeg,打算照着FFmpeg官方文档和官方的examples实现一些程序,加深理解,首先先实现一个解封装的程序。代码运行效果如下图:代码的注释写的很详细,环境是在vs2019中运行的,下面直接上代码:#include<iostream>#include<string.h>extern "C"{#include<libavformat/avformat.h>}int main(int arg

2020-08-05 15:22:08 246

原创 pytorch CPU版本安装教程(windows)

刚刚开始学习,由于我的笔记本没有独立显卡,所以先尝试着装一个CPU版本的。环境准备anaconda3(官网直接下载安装即可)创建conda虚拟环境考虑到以后可能需要使用到多个环境,随意在conda中创建一个虚拟环境来支持pytorch,打开anaconda promptconda create -n pytorch(虚拟环境名字) python=3.7安装pytorch之前先在该虚拟环境中安装上numpyconda install -n pytorch(虚拟环境名字) numpy

2020-07-03 10:46:11 6642 6

原创 android studio动态获取手机读取权限

安卓7.0+如何获取手机读取权限在安卓6.0之前仅仅需要在manifest中注册响应的权限就可以了,在安卓6.0+之后有些等级的权限如媒体读写权限等不仅仅需要在manifest中注册权限还需要用户同意。AndroidManifest中添加<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/&...

2020-04-18 10:23:06 2426

最简单的视频P帧编码的C++实现和tiny_jpeg.c

实现一个最简单的视频P帧编码,通过宏块匹配和运动补偿的方法去实现,同时文件里还有一个tiny_jpeg的工程,直接可以运行

2020-08-26

C++多线程实现解封装和解码的解耦合(基于FFmpeg4.1)

使用多线程来对FFmpeg的demux模块和decode模块的降耦合,解封装和解码各自单独占用一个线程,正常来讲音频解码和视频解码应该各自占用一个线程,在这里为了简单就把他们合并为了一个线程,没加入视频和音频的渲染,读者可以根据情况自行添加。

2020-08-12

基于FFmpeg4的最简单的视频播放器

使用FFmpeg4.1实现了一个视频播放器,代码极其简洁,只有100行左右。简单易懂,vs打开即可运行

2020-08-08

FFmpeg3.4安卓.zip

提供一个编译好的安卓库,3.4版本,支持neon,硬解码,rtsp,http,rtmp,不支持264编码。有需要的可以下载,文件包括.so文件和include文件。armv7a

2020-07-07

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

TA关注的人

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