问题标签 [android-mediacodec]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
20162 浏览

android - 如何使用 Android MediaCodec 生成 AAC ADTS 基本流

我正在尝试做的事情:使用 Android 的 MediaCodec 将原始 PCM 音频样本编码为原始 AAC 文件。

我遇到的问题:当我使用 FFMPEG 将生成的原始 AAC 文件打包到 M4A 容器中时,FFMPEG 抱怨文件中缺少编解码器参数。

细节:

由于我找不到任何用于生成输出 AAC 文件的音频编码器的 MediaCodec 示例代码,因此我尝试将视频编码器修改为音频编码器。原始代码在这里:source_code

我这样配置音频编码器:

然后我为编码器提供每帧 10 毫秒的 PCM 样本。编码器获取每一帧,生成一帧比特流,然后我将比特流写入 FileOutputStream。循环一直持续到输入文件的结尾。

代码运行到最后。我执行“adb pull”以将生成的 AAC 文件从设备获取到我的 PC,并使用 FFMPEG 读取它。以下是命令和错误 FFMPEG 吐出:

我的问题:

  1. 在调用 codec.start() 之前,我已经配置了编码器。为什么生成的 AAC 文件缺少编解码器参数?
  2. 在原始视频编解码器示例中,参数“csd-0”从编码器传递到解码器,但并未明确写入比特流文件。我是否需要明确地将它们写入 AAC 文件?
  3. 我将输入的 PCM 样本分成每帧 10 毫秒,这并不一定会产生完整的输出数据包。对于每个输入帧,我只需将编码器输出的任何内容写入文件。这值得关注吗?

任何帮助将不胜感激。如果有一个示例项目可以完成我在这里尝试做的事情,那就太好了。如果我的源代码可以帮助你帮助我,我会发布它。我需要做一些清理工作。谢谢!

编辑:将标题从“MediaCodec 缺少编解码器参数生成的基本 AAC 文件”更改为“如何使用 Android MediaCodec 生成 AAC ADTS 基本流”

0 投票
1 回答
5319 浏览

android - android media codec 无法为类型“video/mp4”实例化解码器

致力于实现 mediamuxer 类。它接受来自 mediacodec 类的输入(一个音频和一个视频)。但是在尝试为“video/mp4”编码时抛出错误

代码:

错误:

请注意,错误是针对解码器的,调用是创建编码器。

我可能会在一分钟内弄清楚这一点,但它会为遇到此问题的任何其他人提供。

0 投票
2 回答
2208 浏览

android - 如何使用 Android MediaCodec 记录 webview 活动屏幕?

我的任务是在 webview 中记录用户活动,换句话说,我需要在用户在 webview 中导航时创建一个 mp4 视频文件。相当具有挑战性 :) 我在 Android 4.3 中引入了 MediaCodec 的字体:被扩展为包括一种通过 Surface 提供输入的方法(通过 createInputSurface 方法)。这允许输入来自相机预览或 OpenGL ES 渲染。我什至找到了一个可以录制用 opengl 编写的游戏的示例:http: //bigflake.com/mediacodec/

我的问题是:我如何记录 webview 活动?我假设如果我可以将 webview 内容绘制到 opengl 纹理,那么一切都会好起来的。但我不知道该怎么做。

有人可以帮我吗?

0 投票
1 回答
1961 浏览

android - Android MediaMuxer 将 Surface 附加到编解码器输入

好的,我已经查看了Fadden 的实现 Android MediaMux 的示例。我不知道如何让我的场景进入 MP4 多路混合编解码器的表面输入。我正在开发一个音频处理器,它会占用音频和视频 I/O,因此 MediaRecord 失败,但 MediaMux 听起来是一个可行的解决方案。

从编解码器创建一个 inputSurface:

我已经实现了 openGLSurfaceView。我可以简单地通过调用从视图中获取表面:

但这并没有设置表面。它只是抓住它。有没有一种简单的方法可以让 myGLSurface 写入 videoInputSurface。

为了使事情进一步复杂化,我将cameraPreview添加到同一个视图组vg中,myGLView被写入:

并且 myGLView 设置为透明,以便 openGL 场景覆盖在 cameraPreview 之上。

有没有一种简单的方法可以获取 vg 的表面元素?简单地将正在写入 vg 帧的内容放在编解码器的 videoInputSurface 上?

谢谢,

0 投票
1 回答
711 浏览

android - Android MediaCodec MediaMuxer 致命信号 11 (SIGSEGV)

不断收到致命信号 11 崩溃。我已将其调试到以下代码行

第一次通过这行代码时,它返回 -1 表示格式更改,但下一次它就崩溃了。

调查错误是说它与空引用变量有关,但输入和输出缓冲区都不应该为空。

0 投票
1 回答
1863 浏览

android - Android 媒体编解码器崩溃

我正在使用新的 API MediaCodec 和 MediaExtractor(可从 API 16 获得)构建一个 android 视频播放器应用程序。它通常运行良好,但有时我会崩溃并显示非常无意义的消息:

如果有人能让我更好地了解出了什么问题,那就太好了。崩溃通常发生在我打开视频、播放一点、退出、转到另一个视频时。它只发生很少的时间,但很烦人。

0 投票
1 回答
4948 浏览

android - 带有 Surface 输入的 MediaCodec:产生分块输出

我正在尝试通过 CameraPreview 数据生成简短的连续 mp4 文件MediaCodec.createInputSurface()。但是,重新创建MediaCodec及其关联的 Surface 需要停止相机以允许再次调用mCamera.setPreviewTexture(...). 这种延迟会导致不可接受的丢帧数量。

因此我需要定期生成CODEC_CONFIGandEND_OF_STREAM数据而不重新创建输入 Surface,因此必须调用mCamera.setPreviewTexture(...). MediaFormat假设不变,这可能吗?

(我正在改编fadden的CameraToMpegTest示例。我的完整代码在这里

不成功的尝试:

调用MediaCodec.signalEndOfInputStream(),排空MediaCodec,然后MediaCodec.flush()在块之间调用会IllegalStateException在第二次调用MediaCodec.signalEndOfInputStream().

调用MediaCodec.signalEndOfInputStream(), 排空MediaCodec, 然后MediaCodec.stop(); MediaCodec.configure(...), MediaCodec.start()在块之间调用而不再次调用MediaCodec.createInputSurface()会产生以下错误:

解决了谢谢fadden。完整的解决方案来源在这里

0 投票
1 回答
3516 浏览

android - Android MediaMuxer 非法状态异常无法停止 muxer mMediaMuxer.stop()

我在停止 MediaMuxer 时遇到问题。

除了我使用音频之外,几乎一直遵循fadden 的示例,所以我还不能 100% 确定音频和视频轨道排成一行。这可能是问题所在。

当我命中 mMediaMuxer.stop() 的断点时,我收到一个致命错误:

当我调用 stop 时,我可以深入了解 MediaMuxer.mState = MUXER_STATE_INITIALIZED。但它在 nativeStart(mNativeObject) 中失败了......

0 投票
0 回答
822 浏览

android - MediaCodec flush() 像素化(从不同来源解码)

在解码过程中从第二个 MediaExtractor 源加载解码器缓冲区时,两个视频源之间的非常快的像素化过渡是显而易见的,并且在交换视频源之前尝试刷新解码器会使像素化更长且更明显。有谁知道如何使用 MediaCodec API 创建干净的过渡。

0 投票
2 回答
2002 浏览

android - 如何在屏幕方向保持解码?

伙计们,

我正在使用 MediaCodec 解码网络流。MediaCodec 上的方法 configure() 将 SurfaceView 对象作为参数,从而可以轻松地将输出直接解码到表面视图中。

更改设备方向时会出现问题。旧表面被破坏并创建一个新表面。mediacodec 仍然持有的表面变得无效。

我无法销毁 MediaCodec 对象并重新创建一个新对象。这将导致等待几秒钟,直到新的关键视频帧到达。

查看 MediaCodec 上可用的所有方法,似乎更改表面的唯一方法是调用 configure()。可以在 MediaCodec 对象上多次调用 configure() 吗?

或者,也许有一种方法可以存储 MediaCodec 对象的内部状态并将其传输到新的 MediaCodec 对象。

如果您能指导我正确的方向,我将不胜感激。预先感谢您的帮助。