今天在使用android-as_video_player这个开源的框架来实现自己项目中的一个播放器,中间关于ndk编译ffmpeg遇到的坑,现在想起来,对ndk的心态,现在心里都有一万个cnm在奔腾,此处略过ndk编译ffmpeg源码的过程,最后使用的ndk-r10d编译的ffmpeg2.8.5版本。其实这时候ffmpeg已经更新到了4.1版本,要求别这么多,先将就着作用。
第一个坑就是当我把代码码完了,lib也编译通过,程序也能调试了的时候,心里是愉悦的,但跑起来以后,运行不正常,本地文件视频播放不出来,这就很尴尬了哈。
然后通过接口观察数据,发现avformat_open_input这个接口失败了,然后呢?报错信息调试为:Invalid data found when processing input,于是百度,谷歌搜索一番先,然后大部分人说调用的lib被协议部分被禁用的原因,于是就有了自己ndk编译ffmpeg这么操蛋的事情发生了。可我自己编译的lib怎么也不行呢?搞了半天,没办法,自己先阅读一通ffmpeg源码,然后发现还是找不到问题,于是想起来,我可以给ffmpeg设置一个log的回调函数,然后把错误信息报错的更加详细一些,于是加log回调函数,然后获取报错信息: moov atom not found,然后又baidu,google一番,少有收获哈,在https://bbs.csdn.net/topics/300243359论坛上找到第一条有用的信息。
 
 
 
原因是lseek函数在custom的接口中实现的有问题。
而从ffmpeg的源码,我们获取这个报错的信息位置为:
 
 
 
因为mp4文件,moov在文件的末尾,所以这个地方可以判断可能真的是lseek的原因。
然后加断点,发现我写的seek函数在whence等于AVSEEK_SIZE的时候,返回的-1。那custom方式的seek到底怎么实现呢?
经过参考http://www.52ffmpeg.com/article/497.htmlhttps://www.codeproject.com/Tips/489450/Creating-Custom-FFmpeg-IO-Context这两个文件,AVSEEK_SIZE这whence应该是返回文件的大小,同时seek我们也可以参考代码自己实现一个;
于是我自己的实现方式:
 int FileSource::ReadSeek( int offset, int whence){
// 参数检查.
int ret=-;
if (offset > m_nFileSize || !m_file.is_open()){
LOGI("seek offset=%d> file size:%d,or file is close.",offset,m_nFileSize);
return -;
}
if (m_bIsMultithread)
m_mutex.Lock(); std::ios_base::seekdir way = (std::ios_base::seekdir)whence;
// 进行seek操作.
if (whence != AVSEEK_SIZE) {
//先把错误位置给
m_file.clear();
//////////////////////////////
switch(whence){
case SEEK_SET:
//基于文件开始位置进行seek跳转
m_file.seekg(offset,std::ios_base::beg);
// ret = offset;
break;
case SEEK_CUR:
//基于文件当前位置进行seek跳转
m_file.seekg(offset,std::ios_base::cur);
// ret=m_file.tellg();
break;
case SEEK_END:
//基于文件尾的位置进行seek跳转
m_file.seekg(offset,std::ios_base::end);
// ret=m_file.tellg();
break;
}
if (m_file.good())
ret = m_file.tellg();
else
ret = -;
}else{
//等于AVSEEK_SIZE,这个主要是用于获取文件大小
// The whence-parameter has one more option than fseek: AVSEEK_SIZE.
// When this option is passed to the seek function it should return the file size (if possible).
// If its not possible, the function may return and do nothing -1. In my implementation pStream->Seek(...) will fail with AVSEEK_SIZE and SeekFunc will return -1.
ret=m_nFileSize;
} if (m_bIsMultithread)
m_mutex.Unlock(); return ret;
}
然后,视频就能正常解码和播放了
 转载请注明出处:https://www.cnblogs.com/lihaiping/p/10637615.html

(原)关于ffmpeg使用custom io-context遇到的一些坑的更多相关文章

  1. [原] Android上使用native IO

    首先, 官方google play对APK大小有限制: 50M.( https://support.google.com/googleplay/android-developer/answer/113 ...

  2. [原]how to view custom provider's events(collected without provider registered) by wpa

    最近想使用etw作为高效的日志机制,也不想暴露机密信息(关键信息在msnifest文件中).也就是不能在客户机器上注册自己的provider,那需要manifest文件.这样采集回来的.etl文件如果 ...

  3. spring整合mybatis使用<context:property-placeholder>时的坑

    背景 最近项目要上线,需要开发一个数据迁移程序.程序的主要功能就是将一个数据库里的数据,查询出来经过一系列处理后导入另一个数据库.考虑到开发的方便快捷.自然想到用spring和mybatis整合一下. ...

  4. 使用ffmpeg视频编码过程中踩的一个坑

           今天说说使用ffmpeg在写视频编码程序中踩的一个坑,这个坑让我花了好多时间,回头想想,非常多时候一旦思维定势真的挺难突破的.以下是不对的编码结果:                   ...

  5. 使用ByteArrayOutputStream解决IO乱码问题的踩坑记录

    经过:今天在用s3接口做ceph储存的时候,要实现一个io下载的接口.需要把InputStream转成byte[],一开始,是的写法是这样的: byte[] buf = new byte[(int) ...

  6. vue-socket.io使用教程与踩坑记录

    全手打原创,转载请标明出处:https://www.cnblogs.com/dreamsqin/p/12018866.html,多谢,=.=~ (如果对你有帮助的话请帮我点个赞啦) 请先允许我狠狠吐个 ...

  7. FFmpeg内存IO模式(内存区作输入或输出)

    本文为作者原创,转载请注明出处:https://www.cnblogs.com/leisure_chn/p/10318145.html 所谓内存IO,在FFmpeg中叫作"buffered ...

  8. ffmpeg的IO操作

    ffmpeg 可以通过IO操作将数据读取和存储在文件或网络中 作为数据的读取和写入地址,数据被存放在file,http, ffmpeg 不仅可以编解常用的音视频格式,还可以将数据导入/导出到各种媒介中 ...

  9. ffmpeg最全的命令参数

    Hyper fast Audio and Video encoderusage: ffmpeg [options] [[infile options] -i infile]... {[outfile ...

随机推荐

  1. css3中linear-gradient()的使用

    用线性渐变创建图像. 如果想创建以对角线方式渐变的图像,可以使用 to top left 这样的多关键字方式来实现. 示例代码: linear-gradient(#fff, #333); linear ...

  2. PAT基础6-7

    6-7 统计某类完全平方数 (20 分) 本题要求实现一个函数,判断任一给定整数N是否满足条件:它是完全平方数,又至少有两位数字相同,如144.676等. 函数接口定义: int IsTheNumbe ...

  3. C#多线程技术提高RabbitMQ消费吞吐率

    一.课程介绍 本次分享课程属于<C#高级编程实战技能开发宝典课程系列>中的第二部分,阿笨后续会计划将实际项目中的一些比较实用的关于C#高级编程的技巧分享出来给大家进行学习,不断的收集.整理 ...

  4. PHP中new static()与new self()的区别异同分析

    本文实例讲述了PHP中new static()与new self()的区别异同,相信对于大家学习PHP程序设计能够带来一定的帮助. 问题的起因是本地搭建一个站.发现用PHP 5.2 搭建不起来,站PH ...

  5. 提升SQLite数据插入效率低、速度慢的方法(转)

    前言 SQLite数据库由于其简单.灵活.轻量.开源,已经被越来越多的被应用到中小型应用中.甚至有人说,SQLite完全可以用来取代C语言中的文件读写操作.因此我最近编写有关遥感数据处理的程序的时候, ...

  6. Android自定义控件实战——滚动选择器PickerView

    转载请声明出处http://blog.csdn.net/zhongkejingwang/article/details/38513301 手机里设置闹钟需要选择时间,那个选择时间的控件就是滚动选择器, ...

  7. 【ASP.NET Core】EF Core - “影子属性”

    有朋友说老周近来博客更新较慢,确实有些慢,因为有些 bug 要研究,另外就是老周把部分内容转到直播上面,所以写博客的内容减少了一点. 老周觉得,视频直播可能会好一些,虽然我的水平一般,不过直播时,老周 ...

  8. 一步步教你轻松学K-means聚类算法

    一步步教你轻松学K-means聚类算法(白宁超  2018年9月13日09:10:33) 导读:k-均值算法(英文:k-means clustering),属于比较常用的算法之一,文本首先介绍聚类的理 ...

  9. python 过滤文本中的标点符号(转)

    网上搜到的大都太复杂,最后找到一个用正则表达式实现的: import re s = "string. With. Punctuation?" # 如果空白符也需要过滤,使用 r'[ ...

  10. Libreoffice 各类文件转换的filtername

    LIBREOFFICE_DOC_FAMILIES = [ "TextDocument", "WebDocument", "Spreadsheet&qu ...