问题标签 [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 回答
5797 浏览

android - 将 Surface 输入缓冲到 MediaCodec

已经演示了如何为MediaCodec 提供像 CameraPreview 这样的 Surface 输入,但是在提交之前是否有实用的方法来缓冲这个输入MediaCodec

在我的实验中,Galaxy Nexus 在使用CameraToMpegTest.java中的直接同步编码方法生成音频/视频流时遇到了不可接受的问题

当使用MediaCodecwithbyte[]ByteBufferinput 时,我们可以将未编码的数据提交到一个ExecutorService或类似的队列进行处理,以确保没有丢帧,即使设备出现超出我们应用程序控制的 CPU 使用高峰。但是,由于Android的Camera和MediaCodec之间需要进行颜色格式转换,这种方法对于高分辨率的直播视频来说是不现实的。

想法

  1. 有没有办法用 to 喂养创建NativePixmapType的?EGL14.eglCopyBuffers(EGLDisplay d, EGLSurface s, NativePixmapType p)MediaCodec

  2. Android 中的任何人都可以评论协调相机和 MediaCodec 之间的 ByteBuffer 格式是否在路线图上?

0 投票
2 回答
2696 浏览

android - MediaCodec 编码忽略我的 BUFFER_FLAG_SYNC_FRAME 标志

在我的 Android 应用程序中,我使用 MediaCodec 以 webm (vp8) 格式对一些媒体进行编码。编码按预期工作。但是,我需要确保偶尔创建一个同步帧。这是我所做的:

稍后在代码中,我检查同步帧:

问题是 isSyncFrame 永远不会获得真正的价值。

我想知道我的编码配置是否出错。可能有更好的方法来告诉编码器偶尔创建一个同步帧。

我希望这不是 MediaCodec 中的错误。预先感谢您的帮助。

0 投票
2 回答
1847 浏览

android - 使用 MediaMuxer 混合相机预览 h264 编码的基本流

我正在使用Android 4.3 的新 MediaCodec 和 MediaMuxer API 实现有关 previewTexture 录制的Android 测试用例之一。

通过将recordingHint设置为相机参数,我设法以大约30fps的帧速率记录预览流。

但是,我遇到了延迟/滞后问题,并不知道如何解决。当使用相当标准的质量设置(1280x720,比特率约为 8.000.000)录制相机预览时,预览和编码材料偶尔会出现延迟。更具体地说:这种延迟大约每 2-3 秒发生一次,大约需要 300-600 毫秒。

通过跟踪延迟,我发现延迟来自“drainEncoder”方法中的以下代码行:

如果编码器有可用于复用的数据,则循环调用此行。目前我不录制音频,所以只有 h264 流由 MediaMuxer 转换为 mp4 格式。

我不知道这是否与该延迟有关,但它总是在循环需要两次迭代以使编码器的所有可用数据出列时发生(更具体地说,它总是发生在这两次迭代中的第一次) . 在大多数情况下,一次迭代足以使编码器出队。

由于在线上没有太多关于这些新 API 的信息,因此非常感谢您的帮助!

0 投票
2 回答
16759 浏览

android - 如何将 SurfaceTexture 保存为位图

当我将视频解码到表面时,我想将我想要的帧保存为位图/jpeg 文件。我不想在屏幕上绘图,只想将 SurfaceTexture 的内容保存为图像文件。

0 投票
2 回答
1506 浏览

multithreading - 不同服务器配置的 MediaCodec 硬件解码器要慢得多?

我一直在使用 AndroidMediaCodec来(硬件)解码来自 Live 555实时(实时)流的H.264帧。将我的 Live 555 服务器配置从使用(with ) 编码帧更改为严格使用编码帧后,解码帧的时间需要更长的时间。基本上,MediaCodec 跟不上流,并以慢动作显示视频,随着时间的推移越来越慢。回到对我来说不是一个解决方案,因为我需要编码成离散单元的能力,而不是像这样的整个帧。Galaxy S4RTSPffmpegx264x264MediaCodecffmpegNALffmpeg

我想知道这是不是:A)我的服务器编码NAL单元的方式有问题,或者B)我的 Android 客户端有问题,特别是它接收和解码NAL单元的方式。

我的 x264 编码配置是:

我的 Android MediaCodec 客户端设置如下:

NAL我在单独的 Live 555RTSP客户端线程上接收每个单独的单元。每个NAL都与其大小和演示时间一起放入队列中。一个单独的解码器线程NALs从这个队列中抓取,如果没有可用的,则等待直到有。

一些注意事项:

我通常看到的情况是队列开始填满NALs,而不是接近空。所以,我知道解码器线程工作得不够快。我不认为这是在 Android 手机上解码的固有问题(例如,处理限制),因为它对非常低的比特率做同样的事情——同样,当我ffmpeg用来编码时它确实有效。如果我省略某些NAL单位,解码器可以开始跟上。由于我使用的是 Cyanogenmod 10.1,因此提高最低 CPU 频率也有帮助。

编辑:

这是Android客户端的日志,以及专门突出显示垃圾收集器的日志--

整个Logcat:

Logcat 中的垃圾收集器条目:

0 投票
1 回答
4084 浏览

android - 如何使 android TextureView 以正确的方向显示视频

我想使用 Android_4.1 MediaCodec API 编码从相机捕获的视频数据,然后解码视频数据并在 TextureView 上显示视频。现在一切正常,但 TextureView 无法以正确的方向显示解码的视频。请看这两张图片。

1.图1

在此处输入图像描述

2.图2

在此处输入图像描述

图 1 中的 TextureView 显示了我想要的方向。这个 TextureView 称为setRotation(90)。但它并不总是有效。如果我将这个 TextureView 设置为“match_parent/fill_parent/full_screen”,并且还设置了 setRotation(90),它就不起作用。

这是我的相机参数:

我尝试设置TextureView 的 width = screenHeight 和 height = screenWidth,我也尝试设置parameters.setPreviewSize(480, 640),但它们不起作用。

我的问题是我应该如何使全屏 TextureView 以正确的方向显示视频

我英语不好,希望你能理解我。

任何帮助将不胜感激。谢谢!

0 投票
3 回答
15437 浏览

android - MediaMuxer 错误“无法停止混合器”

我正在Camera使用 mime 类型“video/avc”对预览数据进行MediaCodec编码,并将编码数据(仅视频,无音频)传递给MediaMuxer. 多路复用器似乎运行良好并创建了一个合理大小的输出文件(即,我记录的时间越长越大)。但是,当我尝试停止多路复用器时,我收到“无法停止多路复用器”错误:

在失败停止之前有一些可疑的 MPEG4Writer 日志消息:

任何线索是什么原因造成的?不确定您还需要什么信息。

0 投票
1 回答
3468 浏览

android - MediaCodec 和输出格式

我正在尝试使用 MediaDecoder 类编写视频播放器,我遇到了一个问题,它阻碍了我的开发,

这是一个代码片段

问题是每个设备打印的输出格式都会发生变化,因此无法将其打印到 Open GL 纹理。

有没有办法强制解码器始终输出相同的格式?如果没有,是否有人知道任何可用于进行转换的库?

非常感谢您的任何见解

0 投票
1 回答
6316 浏览

android - How to pass Camera preview to the Surface created by MediaCodec.createInputSurface()?

Ideally I'd like to accomplish two goals:

  1. Pass the Camera preview data to a MediaCodec encoder via a Surface. I can create the Surface using MediaCodec.createInputSurface() but the Camera.setPreviewDisplay() takes a SurfaceHolder, not a Surface.
  2. In addition to passing the Camera preview data to the encoder, I'd also like to display the preview on-screen (so the user can actually see what they are encoding). If the encoder wasn't involved then I'd use a SurfaceView, but that doesn't appear to work in this scenario since SurfaceView creates its own Surface and I think I need to use the one created by MediaCodec.

I've searched online quite a bit for a solution and haven't found one. Some examples on bigflake.com seem like a step in the right direction but they take an approach that adds a bunch of EGL/SurfaceTexture overhead that I'd like to avoid. I'm hoping there is a simpler example or solution where I can get the Camera and MediaCodec talking more directly without involving EGL or textures.

0 投票
1 回答
3326 浏览

java - 如何将 MediaMuxer / MediaCodec InputSurface 与 GLSurfaceView 一起使用?

BigFlake示例之后,有一条评论指出:

我使用EGL14.getCurrentContext()查询当前上下文并将其传递给EGL14.eglCreateContext()share_context 参数,但是您如何“切换 EGL 上下文”?

GLSurfaceView 和 MediaCodec.inputSurface 有两个不同的表面和两个不同的上下文,所以我假设您只是eglMakeCurrent()单独调用每个集合,对吗?你需要eglDestroyContext()eglDestroySurface()

添加了更新

感谢 Fadden,我想我发现了这个错误,而不是 drawFrame 我调用的是 drawImage,但你不应该再次更新图像,对吧?

现在,glError 1285在设置 EOS 后调用 dequeueBuffer 时出现内存不足错误???也许我在录音停止后打电话给它。谢谢你的帮助。

在 MyEGLWrapper.java 中创建 EGLSurface

在 CaptureManager.java 中

在 SurfaceTextureManager.java 中

SurfaceTextureManager.java中的错误mSurfaceTexture.updateTexImage();