【问题标题】:Getting unstreamable error with AndroidBreakoutAndroidBreakout 出现无法流式传输的错误
【发布时间】:2015-01-03 17:02:36
【问题描述】:

我一直在探索 Fadden 在http://bigflake.com/mediacodec/ 上的文档和示例,并将补丁http://bigflake.com/mediacodec/0001-Record-game-into-.mp4.patch 应用于突破游戏。不幸的是,在编译代码后,我意识到它不起作用,生成的视频文件无法流式传输。

我看到以下错误: “mp4 文件将不可流式传输。”

根据 Fadden 的说法,这应该通过检查 mBufferInfo.flags (https://stackoverflow.com/questions/23934087/non-streamable-video-file-created-with-mediamuxer) 来解决,这已经在他的代码中完成了,所以我完全不知所措。有其他人让视频录制补丁正常工作吗?

【问题讨论】:

  • 消息来自 MPEG4Writer.cpp (android.googlesource.com/platform/frameworks/av/+/…) 的第 913 行。如果未设置 mWriteMoovBoxToMemory,则会发出它。第 642 行有一个很长的注释,解释了这一切。简短的版本是有一大块数据可以写入文件的前面或末尾,如果没有写入前面,则文件不可流,因为流的接收者无法找到结束阅读。我实际上不知道是什么原因导致它无法写到前面。
  • 我可能应该补充一下:Grafika (github.com/google/grafika) 中有更完整的示例,例如“记录 GL 应用程序”。

标签: android android-mediacodec


【解决方案1】:
【解决方案2】:

您看到的警告只是一个警告,仅此而已。在大多数情况下,MP4 文件无论如何都不能流式传输,因为您可以通过管道传递写入的 MP4 并让另一端播放它(除非您使用很多额外的技巧,或者使用碎片化的 MP4 android MP4 多路复用器无法正常写入)。这里的流式传输意味着一旦你有了最终的 MP4 文件,你就可以开始播放它,而不必寻找到文件的末尾(通过 HTTP 播放可以做到,例如使用 HTTP 字节范围请求)。

为了编写可流式传输的 MP4,muxer 会尝试猜测您的文件将有多大,并在文件的开头保留一个相应的大区域来写入文件索引。如果文件变大以至于索引不适合保留区域,则需要将其写入文件末尾。有关此猜测的更多信息,请参阅https://android.googlesource.com/platform/frameworks/av/+/lollipop-release/media/libstagefright/MPEG4Writer.cpp 中的第 506-519 行。基本上,猜测似乎可以归结为:“默认的 MAX_MOOV_BOX_SIZE 值是基于大约 3 分钟的视频录制,比特率约为 3 Mbps,因为统计数据还显示,大多数捕获的视频将少于 3 分钟。 "

如果您想将这种不可流式传输的 MP4 文件转换为可流式传输的文件,您可以使用 libav/ffmpeg 中的qt-faststart 工具,它只是重新排序文件中的块。

【讨论】:

  • 啊。谢谢...奇怪。我创建的前几个视频无法播放,但今天可以播放。
猜你喜欢
  • 1970-01-01
  • 2013-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-25
  • 1970-01-01
相关资源
最近更新 更多