【问题标题】:Android - Encode a video while decoding itAndroid - 在解码时编码视频
【发布时间】:2016-10-07 03:12:12
【问题描述】:

我使用 SurfaceTexture 和 OpenGL ES 2.0 使用 glsl 着色器修改视频。我还可以使用 MediaCodec 对结果视频进行编码。

问题是我发现解码视频的唯一方法是使用 MediaPlayer 和 SurfaceTexture,但 MediaPlayer 没有逐帧解码选项。所以现在,它就像一个实时编码/解码,没有停顿。

我也尝试过使用 seekTo / pause / start,但它永远不会更新纹理..

那么是否可以逐步解码,以遵循编码过程?恐怕我目前的方法不是很准确。

提前致谢!

【问题讨论】:

    标签: android video opengl-es-2.0 android-mediacodec video-encoding


    【解决方案1】:

    是的,您需要使用 MediaExtractor 和 MediaCodec 对其进行解码,而不是使用 MediaPlayer(解码到您已经与 MediaPlayer 一起使用的同一 SurfaceTexture)。

    这方面的一个例子是 http://bigflake.com/mediacodec/ 的 ExtractMpegFramesTest,也可能是 DecodeEditEncodeTest(或者对于它的 >= Android 5.0 异步版本,请参阅 https://github.com/mstorsjo/android-decodeencodetest)。

    【讨论】:

    • 感谢您的回答,我认为MediaPlayer已经足够了,但显然流速度无法控制,因此无法与编码器同步。问题是ExtractMpegFramesTest可能太慢,DecodeEditEncodeTest示例不使用视频文件作为输入,而是自定义“VideoChunks”,所以我有点难以理解。我需要 min api 18 所以.. 一些帮助将不胜感激,谢谢!
    • 根据 ExtractMpegFramesTest 设法做到这一点。
    【解决方案2】:

    编辑:错误,mediaPlayer 的流不能逐帧使用,似乎它只能在“真实”速度下工作。

    实际上,我已经设法用 MediaPlayer 做到了。按照这个答案:

    stackoverflow - SurfaceTexture.OnFrameAvailableListener stops being called

    使用计数器,您可以加快或减慢视频流的速度,并将其与预览或编码同步。

    但是 - 如果您想对特定帧进行真正的搜索,那么 mstorsjo 的解决方案要好得多。就我而言,我只是想确保编码过程不会比视频输入流更快或更慢。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-02-07
      • 2014-08-17
      • 2011-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-14
      相关资源
      最近更新 更多