我正在为Android开发视频录制和共享应用程序。该应用程序的规范如下:-
从应用程序内部录制10秒(最大)视频(不使用设备的相机应用程序)不再对视频进行编辑将视频存储在Firebase云存储(GCS)存储桶中其他用户下载并播放所述视频
通过研究,我在SO和其他来源上做到了这一点,我发现了以下内容(,如果我错了,请更正):-
这三个选项及其各自的功能是:
1. Ffmpeg
能够实现上述目标,并且在诸如SO之类的网站上有广泛的答案和解释,但是将APK大小增加20-30mb(大库)存在在某些64位设备上无法正常工作的风险
2. MediaRecorder
大多数设备可靠且受其支持将以.mp4格式存储文件(除非转换为h264)易于回放(无需解码)添加mp4和3gp header 根据this question 增加延迟
3. MediaCodec
低级将需要MediaCodec,MediaMuxer和MediaExtractor 在h264中输出(不使用MediaMuxer进行播放)适用于视频操作(尽管在我的用例中不是必需的)低于4.3(API 18)之前的设备不支持难以实现和编码(我的看法-如果我错了,请纠正我)无法获得大量信息,教程,答案或示例(Bigflake.com是唯一的异常(exception))
花了几天的时间之后,我仍然不知道哪种方法适合我的特定用例。请详细说明我应该为我的应用程序做什么。如果有完全不同的方法,那么我也愿意接受。
我最大的标准是视频编码过程应尽可能高效,并且要存储在云中的视频应具有最低的空间使用率,而又不影响视频质量。
另外,如果您能提出用于在Firebase Storage中保存和分发视频的合适格式,请多多指教,或为您提供建议方法的示例,我将不胜感激。
先感谢您!很抱歉阅读了很长时间。 您对此主题的概述适用于这一点。
我将在此主题上加上我可能会错过的2美分:
1.FFMpe
+/-如果您构建自己的SO,则可以根据使用情况将大小减小到大约2-3 MB。通过编辑6000行构建脚本需要花费时间和精力++支持多种格式(几乎所有格式)++每个设备的结果都相同++支持任何分辨率-进行SW-En-/Decoding会消耗大量能量,同时也会使其变慢。有一个支持lib-stagefright的插件,但在许多设备上不起作用(截至2016年5月)-根据您的位置和用例,许 cocoa 能会出现问题。我不是律师,但是我们为此主题提供过法律咨询,而且非常复杂。
2. MediaRecorder
++最容易实现(简化对mediacodec/libstagefright的访问)原始数据直接传递到编码器,因此在这里不会造成困惑++ HW在大多数设备上已加速。使其快速且节能。 ++延迟仅适用于实时流-取决于硬件制造商的实现-结果可能因设备而异++没有许可问题
3.MediaCodec
+/-大多数 2.MediaRecorder 也适用于此(除了易用性之外)++对HW-en-/decode 的访问最灵活-很难用于未想到的情况(例如,混合来自不同来源的视频) +/-流的延迟可以消除(但是很棘手)-硬件制造商有时无法正确实现事情(例如,如果将来自某些DLSR的实时数据馈送到编码器,则三星Galaxy S5有时会产生SIG-SEV。 -SEV。这可能是dslr的错误,但是SIG-SEV是不可避免的,并导致应用程序崩溃,这最终是应用程序开发人员的错误;)))-如果在不使用MediaMuxer的情况下使用,则需要对媒体容器有很好的了解,或者依赖于第三方库
list 显然不完整,有些观点可能不正确。我上次使用视频的时间大约是半年前。
至于您的用例,我建议您使用MediaRecorder,因为它最容易实现,在所有设备上都受支持,并提供大量的质量/尺寸选项。在相同的存储大小下,FFMpeg可以产生更好的结果,但是需要更长的时间(极端情况下,DSLR实时素材的编码速度要快30倍),并且耗能更多。
据我了解您的用例,由于您只想编码和解码,因此无需摆弄MediaCodec。
我建议使用VP8或9,因为您不会遇到许可问题。再次,我不是律师,但是在您自己的服务器上分发H264可能会使您成为广播电台,所以有人告诉我。
希望这对您的决策有帮助