Date: 2016-03-23

Title: m4a文件在iOS上的流媒体播放

Tags: m4a, mp4, iOS, Android

URL: m4a-streaming-play-on-mobile-phone

故障

公司项目中有个语音录制与播放的功能,QA反馈有部分 Android 机型录制的音乐文件无法在 iOS 上进行播放。看了一下 iOS 的实现代码,iOS 的实现有考虑当文件较大时先下载再播放引起的延迟,是按流形式播放的。

找到出错的 m4a 文件,发现如果按下载播放形式,不会出现任何问题;按流形式边下边播,会报错:

on-optimized formats not supported for streaming

原因

m4a 文件本质就是一个mp4文件,m4a仅是声明容器文件中仅含有音频内容。mp4和QuickTime®文件一样都是一种容器文件,类似XML那样由若干个"Atom"组成,每个 atom 文件中存放不同的meta、音频数据、视频数据、字幕等内容。而所谓 "optimize for streaming" 意指将文件中的 meta data 提到文件前部,这样播放器按流形式读取时,可以在获取音视频数据前获取具体的音视频编码信息。

mp4 和 QuickTime 可以使用 Appple 公司的 Atom Inspector 工具打开:

左边的001.m4a 文件是播放出错的 m4a 文件,可以看到,用于存入音频数据(AAC格式)的 mdata 牌ftyp 后,而存放 metadata 的 moov 处于文件的最后。

位于右边的文件是使用iTunes转换后的 m4a 文件,moov 段被移动到了文件前部,mdata 被放置于文件的最后。转换后的m4a可以正常按流形式进行播放。

解决

最初是想将文件转换放到服务端来进行,让它类似缩略图生成那样成为一种文件扩展服务。但是,考虑 CS 团队未必有时间马上开发这个扩展功能而项目又等着急用,最后我还是直接在 Android 中实现了这个 optimizing of Streaming 功能。

使用的是mp4parser Library。简单的将文件使用 mp4parser 复制一下音轨即可,因为项目中为用户录音,实际音轨只有一条,所以将那条音轨取出存入一个新文件即可。代码如下:

        Movie originalMovie = MovieCreator.build(sourceM4a);
Movie destMovie = new Movie();
Track audioTrack = originalMovie.getTracks().get(0);
destMovie.addTrack(audioTrack);
Mp4Builder builder = new DefaultMp4Builder();
Container container = builder.build(destMovie);
container.writeContainer(new FileOutputStream(destM4a).getChannel());

m4a文件在iOS上的流媒体播放的更多相关文章

  1. IOS上传文件开发

    IOS上传文件开发     在移动应用开发  文件形式上传是不可缺少的,近期把IOS这块文件上传文件代码简单的整理一下.假设大家有须要安卓这边的代码,本人也能够分享给大家! QQ群:74432915 ...

  2. 细数iOS上的那些安全防护

    细数iOS上的那些安全防护  龙磊,黑雪,蒸米 @阿里巴巴移动安全 0x00 序 随着苹果对iOS系统多年的研发,iOS上的安全防护机制也是越来越多,越来越复杂.这对于刚接触iOS安全的研究人员来说非 ...

  3. 微信双开是定时炸弹?关于非越狱iOS上微信分身高危插件ImgNaix的分析

    作者:蒸米@阿里移动安全 序言 微信作为手机上的第一大应用,有着上亿的用户.并且很多人都不只拥有一个微信帐号,有的微信账号是用于商业的,有的是用于私人的.可惜的是官方版的微信并不支持多开的功能,并且频 ...

  4. 解决protobuf不能直接在IOS上使用,利用protobuf-net在IOS上通讯

    ---------------------------------------------------------------------------------------------------- ...

  5. iOS上简单推送通知(Push Notification)的实现

    iOS上简单推送通知(Push Notification)的实现 根据这篇很好的教程(http://www.raywenderlich.com/3443/apple-push-notification ...

  6. 【转帖】ios上取得设备唯一标志的解决方案

    原文地址:http://lqzit.iteye.com/blog/2070306 注意:keychina设置完之后,项目目录里的“项目名.entitlements”文件不是手动创建出的,而是在按照如下 ...

  7. 转:基于IOS上MDM技术相关资料整理及汇总

    一.MDM相关知识: MDM (Mobile Device Management ),即移动设备管理.在21世纪的今天,数据是企业宝贵的资产,安全问题更是重中之重,在移动互联网时代,员工个人的设备接入 ...

  8. 关于iOS上的静态库

    最近再进行项目的真机调试,然后发现了一个天坑.就此研究了一些iOS上的静态库的使用: 首先我们是直接拿一个可以运行的项目来制作静态库的,网上大部分都是先创建静态库然后再写内容,看看我的方法. 1.把子 ...

  9. 阻止文件不被上传到iCloud-b

    有空用下 http://www.cocoachina.com/bbs/read.php?tid=86244 http://www.ooso.net/archives/617 http://blog.c ...

随机推荐

  1. js中引号("")中间设置变量

  2. .NET项目web自动化测试实战——Selenium 2.0

    PS:这次用公司的项目来练手,希望公司不会起诉我,因为我绝对是抱着学习的态度,没有任何恶意.仅供交流学习. 该项目是基于SharePoint平台所开发的门户网站,为了切身感受一下Selenium 2. ...

  3. C#中一道关于ADO.NET的基础练习题

    在控制台程序中实现以下功能: 1. 构建3个表(程序启动时自动建立)  (20分): 1) Employee 职工表 (工号.姓名.性别.年龄.部门)  (Num.Name.Sex.Age.Depar ...

  4. TOMCAT源码分析——生命周期管理

    前言 从server.xml文件解析出来的各个对象都是容器,比如:Server.Service.Connector等.这些容器都具有新建.初始化完成.启动.停止.失败.销毁等状态.tomcat的实现提 ...

  5. 混合编程:error LNK2001: unresolved external symbol

    Vs2006+matlab2010rb环境: 1:工具-选项-项目解决方案-VC++目录设置include和lib的路径 2:项目-属性-属性配置-链接器-输入-附加依赖项把库的名字添加进去 VIST ...

  6. 【C#/WPF】图像变换的Undo撤销——用Stack命令栈

    需求: 图层中有一张图片,可以对该图层进行平移.缩放.旋转操作,现在要求做Undo撤销功能,使得图层回复上一步操作时的状态. 关于图像的平移.缩放.旋转,可以参考在下的另一篇博客的整理: http:/ ...

  7. C语言 · 字符串输入输出函数

    算法提高 3-2字符串输入输出函数   时间限制:1.0s   内存限制:512.0MB      描述 编写函数GetReal和GetString,在main函数中分别调用这两个函数.在读入一个实数 ...

  8. Android——TextView属性XML详解

    Android_TextView属性XML详解 博客分类: android   属性名称    描述 android:autoLink    设置是否当文本为URL链接/email/电话号码/map时 ...

  9. 编译器内置宏__LINE__&__FUNCTION__

    编译器内置宏: 先介绍几个编译器内置的宏定义,这些宏定义不仅可以帮助我们完成跨平台的源码编写,灵活使用也可以巧妙地帮我们输出非常有用的调试信息. ANSI C标准中有几个标准预定义宏(也是常用的): ...

  10. 篇三:XPath--解析Html

    导语:爬虫爬取的界面,大致分为静态界面.ajax异步加载.动态界面.静态界面直接获取HTML对象,然后使用XPath获取值 最有用的路径表达式: 表达式 描述 nodename 选取此节点的所有子节点 ...