ffmpeg之H265解码
本文详细介绍如何使用ffmpeg把H265解码成YUV420P格式格式的数据。
首先由于采用VS2017开发,禁用了一个4996的错误:
#pragma error(disable:4996) //全部禁用
#pragma warning(disable:4996)
ffmpeg接收H265的数据,之能一帧一帧发送,不能接收步全的数据,所以需要先把H265解析成一帧数据。
这里我的思路是先建一个大大的缓存,把H265数据保存进来,然后再通过nul头(0x00 0x00 0x00 0x01)来区分每一帧数据。
这里和H264的解析基本完全一样,每一帧的开头4个字节一定是nul头。
char H265Buf[1024 * 512];int H265Lenth = 0;while (true){int iReadSize = fread(frame_buf, 1, 512, InFile);if (iReadSize <= 0){break;}memcpy(H265Buf+ H265Lenth, frame_buf, iReadSize);H265Lenth = H265Lenth + iReadSize;//获取一帧数据while (true){bool OneFrame = false;if (H265Lenth<=8){break;}for (int i = 4; i < H265Lenth-4; i++){if (H265Buf[i] == 0x00 && H265Buf[i+1] == 0x00&& H265Buf[i+2] == 0x00&& H265Buf[i+3] == 0x01){H265Lenth = H265Lenth - i;memcpy(H265Buf, H265Buf+i, H265Lenth);OneFrame = true;break;}}if (OneFrame){continue;}else{break;}}}
下面重点介绍使用ffmpeg解析H265
首先各种初始化:
codec = avcodec_find_decoder(AV_CODEC_ID_H265);c = avcodec_alloc_context3(codec);if (avcodec_open2(c, codec, NULL) < 0) {fprintf(stderr, "Could not open codec\n");return false;}
丢入H265数据
ret = avcodec_send_packet(c, packet);
获取Yuv420P数据
int ret = avcodec_receive_frame(c, frame);
这里获取到的数据,是保存在AVFrame结构体里 面的,这里我琢磨了好久。
AVFrame有一个成员变量如下,来保存数据,其实使用到了data[0],data[1],data[2]
uint8_t *data[AV_NUM_DATA_POINTERS];
本文福利, C++音视频学习资料包、技术视频,内容包括(音视频开发,面试题,FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,srs)↓↓↓↓↓↓见下面↓↓文章底部点击领取↓↓
data[0] 保存Y信息
data[1] 保存U信息
data[2] 保存V信息。
但是,不要简单的认为把数据直接写入文件,就是YUV420P的文件了,其实是不对的。这里有富余数据,每一行的Y信息,举个例子,是480,但是他保存所使用的大小为512大小,
可能是为了更快的计算吧,他的每一行的信息,不是绝对信息,而是2的多少次方的放大信息,我们在保存的时候,需要把多余的数据剔除掉。
其中每一行他使用的大小,在linesize里面标识,linesize[0],linesize[1],linesize[2]
int linesize[AV_NUM_DATA_POINTERS];
linesize[0] 保存Y的一行的大小
linesize[1] 保存U的一行的大小
linesize[2] 保存V的一行的大小
想要得到正确的YUV420P的数据,需要进行转换:
int a = 0, i;for (i = 0; i<frame->height; i++){memcpy(m_YuvBuf + a, frame->data[0] + i * frame->linesize[0], frame->width);a += frame->width;}for (i = 0; i<frame->height / 2; i++){memcpy(m_YuvBuf + a, frame->data[1] + i * frame->linesize[1], frame->width / 2);a += frame->width / 2;}for (i = 0; i<frame->height / 2; i++){memcpy(m_YuvBuf + a, frame->data[2] + i * frame->linesize[2], frame->width / 2);a += frame->width / 2;}
***********************每个Y,U,V的大小,在buf里面可以看到
YUV420P里面,Y的大小是U和V的4被,可以理解为一帧图像:
YYYYYYYYUUVV
先是8个Y值,在2个U,在2个V,顺序排列。
至此,H265保存为YUV420P搞定。
为了便于大家学习和交流,把工程demo上传如下:
采用VS2017开发 C++开发。
本文福利, C++音视频学习资料包、技术视频,内容包括(音视频开发,面试题,FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,srs)↓↓↓↓↓↓见下面↓↓文章底部点击领取↓↓
ffmpeg之H265解码相关推荐
- 解决PotPlayer不支持S/W HEVC(H265)解码
\\工具\插件\解决PotPlayer不支持SW HEVC(H265)解码 方法一: 点击"搜索解码器",会跳转到github https://github.com/Nevcair ...
- ffmpeg硬编解码 Inter QSV
另一篇:ffmpeg硬件编解码Nvidia GPU 硬编解码除了使用Nvidia的GPU之外,Inter的QSV也是一种不错的方案,跟Nvidia不同的是,如果希望使用ffmepg的Inter QSV ...
- ffmpeg H264 编解码配置
ffmpeg H264编解码前面有文章介绍下,本文主要介绍一些参数配置. 编码: int InitEncoderCodec( int iWidth, int iHeight) {AVCodec * p ...
- 使用ffmpeg 命令行解码并显示像素格式为.raw图像
使用ffmpeg 命令行解码并显示像素格式为.raw图像,命令如下: ffmpeg -vcodec rawvideo -f rawvideo -pix_fmt bayer_gbrg8 -s 2448* ...
- rk3588 ffmpeg使用硬件解码
rk3588 ffmpeg使用硬件解码 安装ffmpeg最新的静态构建版本 方法1 安装rkmpp 安装264 安装libdrm 下载ffmpeg源码 方法2 ppa搜索需要的软件包 安装支持rkmp ...
- ffmpeg进行音频解码,QAudioOutput播放解码后的音频
项目在此 https://github.com/qyvlik/AudioTestByFFmpeg 首先我们按照Qt给的官方例子初始化一个QAudioFormat,设置好他的各项参数,ffmpeg解码后 ...
- FFmpeg之硬解码
导读 前面我们已经使用NDK编译出了FFmpeg并且已经集成到了Android Studio中去,相关文章:NDK21编译ffmpeg5.0.1 众所周知,软解码虽然兼容性一流,但是却非常依赖CPU, ...
- ffmpeg常用编解码命令
ffmpeg常用编解码命令 1 ffplay.exe (1) 播放MP4文件,指定标题以及播放分辨率 ffplay.exe -window_title "视频监控" -x 720 ...
- PotPlayer:不支持S/W HEVC(H265)解码 的解决办法
PotPlayer:不支持S/W HEVC(H265)解码 当下载了几十G的4K蓝光原版电影后,播放时出现如下提示: 解决办法: 地址:https://github.com/Nevcairiel/LA ...
- 如何让ffplay或者ffmpeg支持H265编码的rtmp/http-flv 实时直播流
很多初学者不知道ffplay或者ffmpeg是不支持flv封装的rtmp/http-flv流的,其原因是flv不支持H265编码payload的,因为当时制定flv封装协议的时候,H265还没出来,现 ...
最新文章
- 去年我年薪 30W,今年我一天做 3 顿饭
- 毕业后两三月的本科毕业生,他们都怎么样了
- hibernate添加spring 事务管理注意问题记录
- 带电检测必要性_接地电阻检测分析的必要性
- react html编辑器,react项目中使用富文本编辑器
- Hadoop on Mac with IntelliJ IDEA - 5 解决java heap space问题
- 哗啦啦用Java_哗啦啦
- java 可重入锁 clh_Java可重入锁原理
- 摄影测量(一):概述
- iic总线从机仲裁_对 IIC 总线的理解、调用函数以及常见面试问题
- elastic serach学习
- 如何解决U盘装系统后磁盘总容量变小
- q87芯片组服务器主板,Intel 100系列芯片组详解:史上最良心!
- cadence安装完怎么打开_为何cadence软件在虚拟机里安装成功了以后打不开
- Kali 开机启动慢解决方案(用时56秒)
- 微信群管理助手哪里弄的?
- 科技云报道:全面云化时代,企业需要怎样的云安全能力?
- 11月编程排行榜来了,Python依旧占据榜首
- Android初体验——运用手机多媒体
- 简单理解---JVM虚拟机
热门文章
- python将多个txt内容合并_python合并多个txt文件成为一个文件
- LMS自适应滤波的MATLAB实现——实例仿真
- HTMLCSS字体之引入外部字体
- 淘宝HSF 框架使用 总结
- linux udhcpc指令,linux下udhcpc的使用
- 【Linux应用】udhcpc命令获取到ip后,但是没有生效(没有设置进去)
- Hello,programer! 我的第一篇博客
- 控制台出现 Page “xxx“ has not been registered yet 和 uniapp的报错Uncaught Error: Module build fail xxx
- python题目-奇偶数调用函数
- APP测试点总结(全面解析)