ffmpeg关于av_seek_frame的问题

rainv 2011-03-12 03:45:02
关于av_seek_frame的问题,这个函数看源码不支持相对偏移时间,我想先按照bytes模式来seek frame,
之后再按照time来偏移相对时间。但是看源码是每次av_seek_frame都是从stream的开始位置,即SEEK_SET
位置,而不是SEEK_CUR位置。各位大侠有什么好的解决办法么?

ffmpeg仔细看了api,貌似没有这个接口。
...全文
358 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
rainv 2011-03-15
  • 打赏
  • 举报
回复
thank you.
rainv 2011-03-15
  • 打赏
  • 举报
回复
嗯,看了,seek实现部分还根据不同的视频格式进行不同的实现。mpeg等。
CyberLogix 2011-03-15
  • 打赏
  • 举报
回复
av_seek_frame里面的调用很复杂,你没有考虑到的FFMPEG都考虑到了,他先会使用INDEX信息seek,如果没有找到则会使用binary_search,如果还不行他会使用byte_search,你去看一下里面的流程就知道了

每次av_seek_frame都是从stream的开始位置,即SEEK_SET
位置,而不是SEEK_CUR位置

没有必要从SEEK——CUR开始,因为这是多媒体文件,不是一般的二进制文件
blackmash 2011-03-15
  • 打赏
  • 举报
回复
为什么有相对偏移时间这个需求呢?
如果你按照bytes来先seek,mp4/mov格式的文件你可能会seek不了。
seek bytes比较适用的是MPG和TS。
但是看不出,为什么一定要用SEEK_CUR,而不用SEEK_SET?
一直以来, 在多媒体播放器这块, 即使目前有许多开源的播放器项目, 但要写一个播放器仍然是件非常困难的事, 如果在windows上你有可能需要熟悉DShow, 另外的话, 你需要学习一堆开源项目(比如FFmpeg, MPC, VLC, Mplayer), 而且多数都是基于linux, 在windows上学习起来很不容易, 然而这些开源项目对于一些希望快速实现自己播放器, 就显得很困难. 因此, 我创建了这个项目, 致力于以最简单的方法实现自己的播放器, 并提供一个可以很方便使用的接口. 目前, 在这个代码中, 主要链接到FFmpeg来进行解码, 并将其改造成一个通用的播放器框架. 在这个框架中能够接受各种数据的读入, 可以很方便的封装自己的数据读取模块, 也可以很方便的定制自己的视频渲染模块和音频播放模块, 你只需要参考其中的实现即可. 另外在当前的实现中, 因为个人精力实在有限, 所以借鉴了一些开源项目的代码(如Mplayer), 并且该代码主要基于windows平台, 有移植到linux等其它平台的打算. 所以, 我希望有朋友能参与到这个项目中一起研究和学习, 并完成这个目标. 在 https://github.com/Jackarain/avplayer/downloads 中有已经编译好的exe可供测试, 测试命令如下: avplayer.exe test.mp4 或者 avplayer.exe http://edstream.googlecode.com/files/stream.m3u8 或者 avplayer.exe gq.flv.torrent gq.flv.torrent 是从优酷找的一个超清视频文件做的种子. 整个项目分为几个模块: 1. avcore 这只是一个包装类, 实现windows上的窗口创建以及消息响应, 比如: 右击暂停/开始, 单击按屏幕宽百分比seek, F2全屏切换. 在这个模块中, avplayer类是外部接口类, 具体实现在player_impl类中. 在player_impl类中, 初始化各模块结构指针由下面几个函数实现, void init_file_source(media_source *ms); void init_audio(audio_render *ao); void init_video(video_render *vo); 你可以根据自己的需求来修改这些函数实现. media_source是一个提供数据访问的结构, 包含一些函数指针, 如果你需要重新从其它地方读取数据进来提供给播放器, 那么你可以参照这个结构体, 实现这些函数并指向它, 就可以获得从你指定的地方读取数据来进行播放, 这里实现了一个从文件读取数据播放的dll. audio_render是用于播放音频的结构, 同样包含了一些函数指针, 只要实现这些函数指针, 就可以改变音频输出, 比如把音频数据写到文件, 这里实现了2种方式输出音频, 一种是使用dsound来输出音频, 另一种是使用waveout来输出音频. video_render是用于渲染视频的结构, 原理同上, 需要注意的是render_one_frame的data是YUV420格式. 2. libav 这是一个基于ffmpeg的播放框架, 该框架不包含视频渲染和音频播放以及数据读取, 若需要可以实现上述结构体各函数即可, 这个框架中主要完成了使用ffmpeg解码, 以及音视频同步, seek操作处理, 并提供一些基本的控制播放器的函数(在avplay.h中定义). 3. audio 是一个音频播放输出模块实现, 主要实现了audio_render中那几个函数指针. 在这个模块中实现了2套音频输出dsound和waveout. 4. video 是一个视频渲染模块的实现, 实现了video_render中的那几个函数指针. 在这个模块中, 实现了3套视频渲染输出d3d, ddraw, opengl这些方式(还有gdi方式渲染没有添加到video_out.h中). 5. avplayer 是一个使用avcore实现一个简单播放器的示范, 如果要创建一个播放器, 只需要avplayer.h, 然后使用创建一个avplayer对象, 就可以创建一个播放器, 关于如何使用avcore的具体细节可以参考avplayer/main.cpp. 最后, 任何方式(包括商业或非商业)修改或引用该项目的全部或部分源码(或dll), 请在你的软件中或产品文档中必须清楚的声明引用了该项目, 并注明url(https://github.com/Jackarain/avplayer), 你可以偷偷的不这样做, 但这样做是令人欣赏的做法. 最后本程序作者不承担使用该程序所带来的任何问题并拥有一切解释权. mail: jack.wgm@gmail.com

2,542

社区成员

发帖
与我相关
我的任务
社区描述
专题开发/技术/项目 多媒体/流媒体开发
社区管理员
  • 多媒体/流媒体开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧