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