本文详细介绍如何使用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解码相关推荐

  1. 解决PotPlayer不支持S/W HEVC(H265)解码

    \\工具\插件\解决PotPlayer不支持SW HEVC(H265)解码 方法一: 点击"搜索解码器",会跳转到github https://github.com/Nevcair ...

  2. ffmpeg硬编解码 Inter QSV

    另一篇:ffmpeg硬件编解码Nvidia GPU 硬编解码除了使用Nvidia的GPU之外,Inter的QSV也是一种不错的方案,跟Nvidia不同的是,如果希望使用ffmepg的Inter QSV ...

  3. ffmpeg H264 编解码配置

    ffmpeg H264编解码前面有文章介绍下,本文主要介绍一些参数配置. 编码: int InitEncoderCodec( int iWidth, int iHeight) {AVCodec * p ...

  4. 使用ffmpeg 命令行解码并显示像素格式为.raw图像

    使用ffmpeg 命令行解码并显示像素格式为.raw图像,命令如下: ffmpeg -vcodec rawvideo -f rawvideo -pix_fmt bayer_gbrg8 -s 2448* ...

  5. rk3588 ffmpeg使用硬件解码

    rk3588 ffmpeg使用硬件解码 安装ffmpeg最新的静态构建版本 方法1 安装rkmpp 安装264 安装libdrm 下载ffmpeg源码 方法2 ppa搜索需要的软件包 安装支持rkmp ...

  6. ffmpeg进行音频解码,QAudioOutput播放解码后的音频

    项目在此 https://github.com/qyvlik/AudioTestByFFmpeg 首先我们按照Qt给的官方例子初始化一个QAudioFormat,设置好他的各项参数,ffmpeg解码后 ...

  7. FFmpeg之硬解码

    导读 前面我们已经使用NDK编译出了FFmpeg并且已经集成到了Android Studio中去,相关文章:NDK21编译ffmpeg5.0.1 众所周知,软解码虽然兼容性一流,但是却非常依赖CPU, ...

  8. ffmpeg常用编解码命令

    ffmpeg常用编解码命令 1 ffplay.exe (1) 播放MP4文件,指定标题以及播放分辨率 ffplay.exe -window_title "视频监控" -x 720 ...

  9. PotPlayer:不支持S/W HEVC(H265)解码 的解决办法

    PotPlayer:不支持S/W HEVC(H265)解码 当下载了几十G的4K蓝光原版电影后,播放时出现如下提示: 解决办法: 地址:https://github.com/Nevcairiel/LA ...

  10. 如何让ffplay或者ffmpeg支持H265编码的rtmp/http-flv 实时直播流

    很多初学者不知道ffplay或者ffmpeg是不支持flv封装的rtmp/http-flv流的,其原因是flv不支持H265编码payload的,因为当时制定flv封装协议的时候,H265还没出来,现 ...

最新文章

  1. 去年我年薪 30W,今年我一天做 3 顿饭
  2. 毕业后两三月的本科毕业生,他们都怎么样了
  3. hibernate添加spring 事务管理注意问题记录
  4. 带电检测必要性_接地电阻检测分析的必要性
  5. react html编辑器,react项目中使用富文本编辑器
  6. Hadoop on Mac with IntelliJ IDEA - 5 解决java heap space问题
  7. 哗啦啦用Java_哗啦啦
  8. java 可重入锁 clh_Java可重入锁原理
  9. 摄影测量(一):概述
  10. iic总线从机仲裁_对 IIC 总线的理解、调用函数以及常见面试问题
  11. elastic serach学习
  12. 如何解决U盘装系统后磁盘总容量变小
  13. q87芯片组服务器主板,Intel 100系列芯片组详解:史上最良心!
  14. cadence安装完怎么打开_为何cadence软件在虚拟机里安装成功了以后打不开
  15. Kali 开机启动慢解决方案(用时56秒)
  16. 微信群管理助手哪里弄的?
  17. 科技云报道:全面云化时代,企业需要怎样的云安全能力?
  18. 11月编程排行榜来了,Python依旧占据榜首
  19. Android初体验——运用手机多媒体
  20. 简单理解---JVM虚拟机

热门文章

  1. python将多个txt内容合并_python合并多个txt文件成为一个文件
  2. LMS自适应滤波的MATLAB实现——实例仿真
  3. HTMLCSS字体之引入外部字体
  4. 淘宝HSF 框架使用 总结
  5. linux udhcpc指令,linux下udhcpc的使用
  6. 【Linux应用】udhcpc命令获取到ip后,但是没有生效(没有设置进去)
  7. Hello,programer! 我的第一篇博客
  8. 控制台出现 Page “xxx“ has not been registered yet 和 uniapp的报错Uncaught Error: Module build fail xxx
  9. python题目-奇偶数调用函数
  10. APP测试点总结(全面解析)