Android - 在MediaRecorder,MediaCodec和Ffmpeg之间进行选择

Roh*_*ark 11 video android ffmpeg mediarecorder mediacodec

我正在为Android开发视频录制和共享应用程序.该应用程序的规格如下: -

  • 从应用程序内部录制10秒(最大)视频(不使用设备的相机应用程序)
  • 没有进一步编辑视频
  • 将视频存储在Firebase云存储(GCS)存储桶中
  • 其他用户下载和播放所述视频

从研究中我做了SO和其他人的来源,我发现了以下内容(如果我错了请纠正我): -

这三个选项及其各自的特点是: -

1. Ffmpeg

  • 无论如何能够实现上述目标,并在SO等网站上有广泛的答案和解释
  • APK大小增加20-30mb(大型图书馆)
  • 在某些64位设备上运行不正常的风险

2. MediaRecorder

  • 大多数设备可靠且支持
  • 将以.mp4格式存储文件(除非转换为h264)
  • 更易于播放(无需解码)
  • 添加mp4和3gp标头
  • 根据此问题增加延迟

3. MediaCodec

  • 低级
  • 将需要MediaCodec,MediaMuxer和MediaExtractor
  • 以h264输出(不使用MediaMuxer进行播放)
  • 适合视频操作(但在我的用例中不需要)
  • 4.3之前的(API 18)设备不支持
  • 更难以实现和编码(我的意见 - 如果我错了,请纠正我)
  • 没有广泛的信息,教程,答案或样本(Bigflake.com是唯一的例外)

花了好几天后,我仍然无法弄清楚哪种方法适合我的特定用例.请详细说明我应该为我的申请做些什么.如果有一种完全不同的方法,那么我也对此持开放态度.

我最大的标准是视频编码过程尽可能高效,并且要存储在云中的视频应该具有尽可能低的空间使用率,而不会影响视频质量.

另外,如果您可以建议在Firebase存储中保存和分发视频的相应格式,我将不胜感激,并指出我建议方法的教程或示例.

先感谢您!很抱歉长时间阅读.

小智 14

您对此主题的概述适用于这一点.我只会在这个主题上加上我的2美分,你可能会错过这个主题:

1.FFMpeg

  • +/-如果您构建自己的SO,那么您可以将大小减小到大约2-3 MB,具体取决于用例.编辑6000行的buildscript需要花费时间和精力

  • ++支持多种格式(几乎所有)

  • ++每个设备的结果都相同

  • ++支持任何分辨率

  • - 由于SW-En- /解码而导致高能耗,同时也使其变慢.有一个插件支持lib-stagefright,但它在许多设备上都不起作用(截至2016年5月)

  • - 根据您的位置和用例,许可可能会有问题.我不是律师,但我们就这个主题进行了法律咨询,而且非常复杂.

2. MediaRecorder

  • ++最容易实现(简单访问mediacodec/libstagefright)原始数据直接传递给编码器,所以没有乱码

  • ++ HW在大多数设备上加速.使其快速节能.

  • ++延迟仅适用于直播

  • - 取决于硬件制造商的实施

  • - 结果可能因设备而异

  • ++没有许可问题

3.MediaCodec

  • +/-大多数2.MediaRecorder也适用于此(除了易用性)

  • ++最灵活地访问HW-en- /解码

  • - 难以用于未被考虑的案例(例如混合来自不同来源的视频)

  • +/-可以消除流式传输的延迟(虽然很棘手)

  • --HW制造商有时不能正确实现(例如,如果来自某些DLSR的实时数据被送入编码器,三星Galaxy S5有时会产生SIG-SEV.工作正常一段时间,然后突然间它是SIG- SEV.这可能是dslr的错,但是SIG-SEV是不可避免的并且崩溃应用程序,这最终是app开发者的错;))

  • - 如果没有MediaMuxer,您需要对媒体容器有充分的了解或依赖第三方库

该列表显然不完整,有些点可能不正确.我上次与视频合作的时间差不多是半年前的事了.

至于你的用例,我建议使用MediaRecorder,因为它是最容易实现的,在所有设备上都支持,并提供了大量的质量/大小选项.FFMpeg在相同的存储容量下可以产生更好的效果,但需要更长时间(极端情况下,DSLR实时素材的编码速度提高了30倍),并且耗能更多.据我了解你的用例,没有必要摆弄MediaCodec因为你只想编码和解码.

我建议使用VP8或9,因为你不会遇到许可问题.我再也不是律师,但在你自己的服务器上分发H264可能会让你成为一个广播电台,所以我被告知.

希望这有助于您做出决策

  • 在某些设备上 MediaRecorder 有问题(不会录制视频..),带有 Camera2 API 和 Surface 视频来源:https://github.com/googlesamples/android-Camera2Video/issues/86 (2认同)