ffmpeg开发手记

<script type="text/javascript"> document.body.oncopy = function() { if (window.clipboardData) { setTimeout(function() { var text = clipboardData.getData("text"); if (text && text.length>300) { text = text + "/r/n/n本文来自CSDN博客,转载请标明出处:" + location.href; clipboardData.setData("text", text); } }, 100); } } </script> <script type="text/javascript">function StorePage(){d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(keyit=window.open('http://www.365key.com/storeit.aspx?t='+escape(d.title)+'&u='+escape(d.location.href)+'&c='+escape(t),'keyit','scrollbars=no,width=475,height=575,left=75,top=20,status=no,resizable=yes'));keyit.focus();}</script>

ffmpeg是当前最重要的开源多媒体工程,我之前和现在做的很多项目都用到了ffmpeg。我会在本文中不断更新一些使用和移植优化ffmpeg的心得,和大家一起交流提高。为了方便查看采用Q&A的形式。

Q1:我用一个解码循环解一便视频文件后,调用av_seek_frame到开始位置用同一个循环再解一遍,可第二次的第一祯总是该视频的最后一祯,这是什么原因呢?我的调用方法
av_seek_frame(pFormatCtx, -1, pFormatCtx->start_time, 0)
后来发现
av_seek_frame(pFormatCtx, -1, 0, 0)效果一样,调用模式try了所有除了有一个没有进解码循环,其他都一样。

A: 重新解码前要flush codec
avcodec_flush_buffers(...streams[video_index]->codec)

Q2: 我调用av_seek_frame后解出的图像是花的,调用avcodec_flush_buffers后也是一样

A: 没有seek到I Frame

Q3:把ffmpeg移植到mtk平台,出现Undefined symbol Image$$ZI$$Limit (referred from sys_stackheap.o).

A: ffmpeg是跨平台的,里面用到了很多标准C函数,而MTK里面是不允许越过OS直接操作内存的,所以 printf,malloc,fopen,assert,abort函数需要全部define成MTK的系统函数。 比如fopen改成FS_Open,assert改成ASSERT等。

Q4: 用libavformat demuxer出来的raw音频或raw视频用播放器怎么放不了?

A:  还需要文件开头加上几个字节 才能让播放器识别格式。比如mpeg4要加一个VOL,h.264要加起始码0001, aac要加FFF9, amrnb要加6个字节“#!AMR"

5. 如何正确使用av_seek_frame实现视频拖放

   time=5;//拖放到5秒的位置 

    ret = av_seek_frame(FormatCtx,videoStream,(int64_t)time*(AV_TIME_BASE),AVSEEK_FLAG_BACKWARD); 

 

 注:AVSEEK_FLAG_BACKWARD的作用是seej到请求的timestamp之前最近的关键帧

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值