这么多年一直在做音视频的开发,基本上都是用大家熟知的ffmpeg完成视频的编解码,要说是用起来也算比较简单,但是想要用好其实也不容易,今天心血来潮,决定做一个通用的视频编解码sdk,把调用接口、参数简单化,供大家使用;
视频编解码基本上还是采用libx264、libx265以及ffmpeg完成的,在同码率、同分辨率等参数配置情况下,压缩到同样画质下H265肯定要比H264压缩比高,简单理解,就是在同样的图像质量下,H265编码的视频大小比H264减少了大约40%-50%,大概是一半的水平。
1、码率
在码率方面,比起264/AVC,265/HEVC提供了更多不同的工具来降低码率,以编码单位来说,H.264中每个宏块(宏块/MB)大小都是固定的16x16像素,而265的编码单位可以选择从最小的8x8到最大的64x64;
2、计算量
在效率方面,h265还是比较吃cpu的,基本上很多时候软编解码都完成不了,所以很多时候需要用的h265的时候,可能需要采用硬编码来实现;
目前我们自己封装的编解码库可以支持H263、h264、h265等多种视频编解码接口比较简单,通过以下4个函数就可以完成复杂的编解码,也可以实现转码和视频转换、视频缩放等功能,视频分辨率可以从cif~1080p~4k 都可以全面支持;
int uniqueVideoInit()
int uniqueVideoDestroy()
int uniqueVideoEncode()
int uniqueVideoDecode()
伪代码:
只要设置基本视频参数就可以完成调用,非常方便简单;
int main(int argc, char* argv[])
{
int iCodecId = 2, iCodecType = 0;
if(argc < 5)
{
printf("Error:argc=%d\n",argc);
return -1;
};
iCodecType = atoi(argv[1]);
if (iCodecType < 0)
{
iCodecType = 0;
}
iCodecId = atoi(argv[2]);
if (iCodecId <= 0)
{
iCodecId = 0;
}
strncpy(gacInFilename, argv[3], 127);
strncpy(gacOutFilename, argv[4], 127);
stVideoContext *pstContext = NULL;
pstContext = (stVideoContext *)malloc(sizeof(stVideoContext));
if (pstContext == NULL)
{
return -1;
}
//iCodecType=0:encode, iCodecType=1:decode;
pstContext->iCodecType = iCodecType;
pstContext->iCodecId = iCodecId;
pstContext->iFrameRate = 30;
pstContext->iInWidth = VIDEO_WIDTH;
pstContext->iInHeight = VIDEO_HEIGHT;
pstContext->iOutWidth = VIDEO_WIDTH;
pstContext->iOutHeight = VIDEO_HEIGHT;
if( uniqueVideoInit(pstContext) == -1)
{
return -1;
}
vcEncode(pstContext);
uniqueVideoDestroy(pstContext);
free(pstContext);
getchar();
return 0;
}
自研的音频编解码算法库
为了解决各种音频编解码的差异性,我根据多年的音视频编解码经验自研整理了一个编解码算法库,可以支持多种平台应用,项目支持H263、h264、h265等多种视频编解码算法及测试程序和音频文件,后续还会继续更新迭代算法,接口调用也特别简单,几行代码就可以解决所有的视频编解码工作,让音视频开发更简单;
windows平台和linux平台的我都已经编译好了,其他平台如有需要也可以支持,如果需要沟通交流可以跟我联系。
tel:18108010758
vx:unique_no_1