使用ffmpeg d3d11va的时候出现帧的时序上混乱。
通过ffmpeg 源码可知,ffmpeg 用d3d11va 时 出来的frame 中的data[0]存放的是decode texture数组(默认大小为20),data[1] 存放下标(可以发现,貌似下标总是一个随机的值,没调试进去,所以没有发现在哪里修改下标,不过通过下表访问的数据是没错的)。decode texture是在显存上的一个纹理,但是如果按demo中的方式去取图像,他需要先创建一个staging 类型的 texture ,再将decode texture拷贝到staging类型的 texture,再将staging 类型的texture中的内容map出来,这是极为消耗时间的 。我的操作是直接decode texture放到我的default类型的render texture中。开始的时候出现问题帧时序上的问题。但是如果调用ffmpeg demo中的原始的代码,却没有出现这个问题。

查了一通,发现这里。

大概意思就是: D3d中有一个内部的命令缓冲(command list)机制,这个机制能减少用户态和内核态的切换。很多函数执行完后,会暂时将操作放到command list中,后续command list会高效的去执行。有以下几个操作能让command list立马执行完。

猜测 因为ffmpeg d3d11va 中解码时在内部有开启子线程。多线程操作导致了在 copysubresource 时 ,产生了pipeline stall。  
于是在copysubresourceregion后加入flush 命令,果然就没有这个问题了。下面的lock是必须加上的。

D3D11_BOX box; box.back = 1, box.front = 0, box.left = 0, box.right = descT.Width, box.top = 0, box.bottom = descT.Height;
ctx1->lock(ctx1->lock_ctx);
dctx->CopySubresourceRegion(frame->m_d3DTextureFfmpeg, 0, 0, 0, 0, (ID3D11Texture2D*)m_frame->data[0], currentFrameIndex,&box); //may be we can use the buffer in the frame directly
dctx->Flush(); //清空缓冲命令 //https://docs.microsoft.com/zh-cn/windows/desktop/api/d3d11/nf-d3d11-id3d11devicecontext-flush
ctx1->unlock(ctx1->lock_ctx);

值得注意的是copysubresouce 大概是有两帧的延时:

ffmpeg d3d11va 加速 访问帧 出现帧混乱 flush相关推荐

  1. ffmpeg将视频流转化成图片帧,将图片帧转化为视频(基本无损)

    ffmpeg将视频流转化成图片帧,将图片帧转化为视频(基本无损) 其中-r 和-framerate 都是代表帧率(这个属性属于图片的属性,需要放在图片之前) -s 控制输出格式大小 本人在一个视频稳定 ...

  2. live555+ffmpeg如何提取关键帧(I帧,P帧,B帧)

    live555+ffmpeg如何提取关键帧(I帧,P帧,B帧) 开发流媒体播放器的时候,特别是在windows  mobile,symbian(S60)平台开发时,很可能遇到需要自己开发播放器的情况. ...

  3. 使用ffmpeg从视频中截取图像帧(最简单实用的视频抽帧,一句命令)

    Table of Contents 1.最佳方式 2.普通的命令:(画质差) 3. 视频旋转: 4. 批量视频抽帧: 参考:ffmpeg视频抽帧 1.最佳方式 第二种方法抽帧图片画质很差,这里提供更好 ...

  4. FFmpeg 硬件加速(硬解码)介绍

    参考地址 概述   本文主要针对ffmpeg支持的硬解码做一个总结阐述.   许多平台提供对专用硬件的访问,以执行一系列与视频相关的任务.使用此类硬件可以更快地完成某些操作,例如解码.编码或过滤,或者 ...

  5. 从 FFmpeg 性能加速到端云一体媒体系统优化

    简介:7 月 31 日,阿里云视频云受邀参加由开放原子开源基金会.Linux 基金会亚太区.开源中国共同举办的全球开源技术峰会 GOTC 2021 ,在大会的音视频性能优化专场上,分享了开源 FFmp ...

  6. FFmpeg 硬件加速方案概览 (下)

    被称为"多媒体技术领域的瑞士军刀",FFmpeg拥有广泛的应用基础.不过,当(实时)处理海量视频时,需要借助各种方法提升效率.比如,短视频平台Revvel将视频转码服务迁移到AWS ...

  7. ffmpeg 硬件加速 wmv 视频转码

    基于 Windows 下演示,Linux 下也可以通用.建议先阅读关于使用硬件加速的基础部分.文章链接:ffmpeg 硬件加速视频转码指南 后文将会演示 wmv3 以及 vc1 编码的 wmv 格式视 ...

  8. 图像和流媒体 -- I 帧,B帧,P帧,IDR帧的区别

    参看:什么是I帧,P帧,B帧 参看:H264编码原理以及I帧B帧P帧 一.H246简介 H264是新一代的编码标准,以高压缩高质量和支持多种网络的流媒体传输著称,在编码方面,我理解的他的理论依据是:参 ...

  9. python小工具------将H264/H265码流文件转为一帧一帧的JPEG文件

    一.功能 输入H264/H265码流路径,此脚本可以将对应的码流转为一帧一帧的JPEG文件,并保存到指定路径. 二.具体实现 import av import sysdef h265ToJpg_dem ...

最新文章

  1. java两个线程同时运行_java如何几乎同时结束两个线程
  2. AlphaCode惊世登场!编程版“阿法狗”悄悄参赛,击败一半程序员
  3. jquery腾讯微博
  4. java万年历计算法定节假日,java获取中国节假日
  5. Multi Dimension 数据库设计
  6. [MobX State Tree数据组件化开发][3]:选择正确的types.xxx
  7. vue 前期准备,项目结构
  8. 崩坏3服务器维护2月8号,《崩坏3》8月29日版本更新,全服维护通知
  9. 生产者消费者实现用c语言用物品1,物品2等来代替,用C语言编写程序:生产者和消费者之间实现同步与互斥问题...
  10. ImportError: _C.cpython-36m-x86_64-linux-gnu.so: undefined symbol: _ZN2at4_ops6narrow4callERKNS_6Ten
  11. 高德离线数据api_高德地图Android API发布V1.0.4版本,增加离线地图功能
  12. CC2630 7x7 更改为5X5
  13. 三菱PLC步进伺服控制程序 用三菱plc和威纶触摸屏编写
  14. 人工智能电话机器人的功能
  15. 【计算机毕业设计】停车场管理系统
  16. 杭州到温州老家自驾路线优化与整理
  17. angular aot编译报错 ERROR in ./src/main.ts 解决方法
  18. 如何查看电脑的 CPU 信息 ?
  19. excel分类汇总多个工作表
  20. 330+地级市GDP以及一二三产业增加值数据(1995-2020)

热门文章

  1. 缓存雪崩、击穿和穿透
  2. CentOS 安装Crontab
  3. 绝地求生钓鱼php源码,(搬运)好像是绝地求生的无后座源码!
  4. 能装满你MP3的好歌
  5. 深入浅出数据分析 - 实验
  6. Win11桌面贴纸功能怎么开启?
  7. 实验2 SQL 查询语句
  8. Windows获取主板温度
  9. php企业网站带模块,DouPHP模块化企业网站管理系统(含小程序/公众号) v1.6 Release 20200818...
  10. 制作光盘安装linux系统教程,在Windows上制作CentOS自动安装的光盘的教程