初次学习和使用ffmpeg,电脑系统有点老,没办法使用最新版的ffmpeg 3.3,只能从别处下载了一个2.8版的用用,官网提供的历史版本都没有我电脑可用的版本。

花了两天时间学习并写了一个简单的处理视频的程序,实现视频的截屏保存为jpg图片。

本来想用SDL写个播放器,但写着写着,感觉实现视频、音频同步什么的有点难,有点累,就没再继续。

今天在研究视频定位(seek)的时候,在测试代码时发现问题:

我测试了不同格式的视频: mp4,flv,mov,3gp,wmv,mkv,avi

定位,我用的是 av_seek_frame(),如果定位:wmv,avi,3gp 等,我只需简单的使用:

int64_t seekTime_us = (int64_t)8 * AV_TIME_BASE; //单位: 微秒, 必须加 (int64_t),否则有可能发生数据溢出。
av_seek_frame(pFormatCtx, -1 , seekTime_us, AVSEEK_FLAG_BACKWARD); // AVSEEK_FLAG_BACKWARD | AVSEEK_FLAG_ANY | AVSEEK_FLAG_FRAME

结果:定位很准确。

但上面的代码用来定位:mp4,flv,mov,mkv等,经常会遇到定位不准的情况,误差在[0-5秒]左右。

在网上搜索了半天,找到下面另一种计算方法,经测试和上面的效果其实是一样的,误差在[0-5秒]左右,还不如上面的简单。

int startSecond = 8;
int64_t seekTime_us = startSecond * AV_TIME_BASE; //单位: 微秒
int64_t targetFrame = av_rescale_q(seekTime_us, AV_TIME_BASE_Q, pFormatCtx->streams[videoStream]->time_base);

int64_t seekStreamDuration = pFormatCtx->streams[videoStream]->duration;
int flags = AVSEEK_FLAG_BACKWARD; //默认使用
if(targetFrame > 0 && targetFrame < seekStreamDuration)
{
    // H.264 I frames don't always register as "keyframes" in FFmpeg
    flags |= AVSEEK_FLAG_ANY; //加了这个,有时定位更不准
}

av_seek_frame(pFormatCtx, videoStream, targetFrame, flags);
avcodec_flush_buffers(pCodecCtx);

我又换了个方式:先计算视频的总帧数(frameCount),然后通过fps计算出8秒位置的frame_index, 不用av_seek_frame,直接通过while(av_read_frame()),跳过frame_index,来实现seek,这个方法定位非常准,但不科学。因为如果要定位到60秒,我用的电脑光是花费在while(av_read_frame())上的时间就将近4秒,效率太低了,只适合定位开头几十秒内。

谁能告诉我,怎样用 av_seek_frame 来定位 mp4,flv 格式的视频精准一点,不要定位到8秒,显示的是5秒时的内容。

名品推荐:宝诗黎 女巫和骑士 Amykukula

转载于:https://www.cnblogs.com/personnel/p/7265775.html

av_seek_frame() 定位为什么不准呢?相关推荐

  1. vs中使用ctrl+左键定位函数不准

    问题描述: 1.vs2022突然遇到ctrl+左键定位不准: 2.点类视图的函数名,仍然不能准确定位到该函数 解决方法: 1."解决方案资源管理器",将出问题的源文件上点右键--& ...

  2. GPS定位准不准 决定定位精度的诸多因素

    GPS在实际生活中为我们带来许多便利,其最主要的功能来自于本身的精准定位.无论是车载导航仪为我们指路导航,还是手持机为我们提供精确的经纬度用来指明方向,以及GPS产品在工业上.物流业中甚至诸多行业中带 ...

  3. 百度地图web API定位不准,定位偏移问题处理

    百度地图浏览器API  获取GPS定位是根据调用浏览器核心获取GPS,部分手机型号定位不准,主要是因为部分手机采用的是GOOGLE  GPS坐标格式.部分手机用的是原生坐标格式 这两种格式百度地图无法 ...

  4. 华科提出目标检测新方法:基于IoU-aware的定位改进,简单又有效

    作者 | 周强 来源 | 我爱计算机视觉(ID:aicvml) [导语]近日,华中科技大学发表了一篇新论文<IoU-aware Single-stage Object Detector for ...

  5. 深度学习(十七)基于改进Coarse-to-fine CNN网络的人脸特征点定位

    基于改进Coarse-to-fine CNN网络的人脸特征点定位 原文地址:http://blog.csdn.net/hjimce/article/details/50099115 作者:hjimce ...

  6. 毕业设计基础测试 定位+后端处理+退出删除

    算是对前面的知识的一个小整合了,首先是前段的静态网页,利用手机gps定位得到经纬度,转换成百度的地图标准之后显示在两个输入框里面,点击按钮利用ajax技术存储在后端的数据库中,同时将返回的地址编号显示 ...

  7. android webview获取Gps位置不准

    问题背景:发现在android原生嵌套webview定位一直不准,只是显示在当前省市区,而不能精准显示位置,而在微信浏览器或者系统浏览器开启gps后则能精准定位 最后解决如下:在ChromeWebcl ...

  8. 关于微信开发定位获取当前经纬度在百度地图上不准确的问题。

    这个其实在18年都不是问题,因为微信定位的不准,我们可以选择直接用地图的获取当前经纬度的方法,还是很准的,但是微信更新后我发现在微信浏览器中都不能使用其他地图的定位功能了,这里我自己是测试了百度和腾讯 ...

  9. [隐私安全]PC端网页版百度地图是如何定位你的真实地址的

    本文转载自https://blog.catscarlet.com/201612122637.html 注:本文适用于网页版百度地图,同样适用于阿里的高德地图,以及搜狗地图等. PC端打开网页版百度地图 ...

最新文章

  1. PHP——explode的应用(获取字符串,拆为下拉列表)
  2. anaconda有什么用?pycharm有什么用?anaconda怎么与pycharm一起联合使用?
  3. 浙江省单招单考计算机专业,2016浙江省单招单考《计算机类》试题卷
  4. 导出jar插件_利用类加载器解决不兼容的Jar包共存的问题
  5. 【caffe-Windows】mnist实例编译之model的使用-classification
  6. Win10光驱不见了
  7. python默认字体大小_python – 如何设置PIL加载的默认字体的大小,使其适合我的8×8矩阵?...
  8. iPhone 11 引领芯片新革命?
  9. 是的,我开通了小密圈
  10. php formdata 解析,系统学习前端之FormData详解
  11. 【存档】使用OllyDbg+ResHack+LordPE来修改EXE文件
  12. 20191117 四川大学新生赛划水总结 --__- ...
  13. 数据中心网络图怎么画?几步教会你
  14. MongoDB 分片集群故障RECOVERING 处理纪实
  15. STM32单片机初学2-从Keil工程创建开始
  16. 微信分享和微信H5跳转到APP开放标签wx-open-launch-app使用及样式设置
  17. 网站导航应该怎么设计?
  18. MongoDB 分片迁移
  19. dede修改描述description限制字数长度
  20. 线上测评图形题技巧一

热门文章

  1. 做好前端的话HTML和CSS基础必须夯实!
  2. 被迫“内卷”的程序员,真的就不值钱了吗?
  3. 20个很有帮助的 Web 前端开发教程
  4. 死锁、EAT、页表、单双缓冲区典型题目及解析
  5. java downloadfile_FileDownload.java:文件下载工具类
  6. opencv矩阵掩膜操作(提高图片对比度)
  7. mysql group set,Mysql--group_concat()、group by、find_in_set()使用笔记
  8. MySQL事务基础,看这篇就够了!
  9. 面试官问你Java内存区域你用new创建对象来解释
  10. 一步一步带你安装Node.js并创建第一个Vue项目