问题标签 [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.
android - 带有 Surface 输入的 MediaCodec:在后台录制
我正在开发一个视频编码应用程序,我想防止在托管 Activity 进入后台或屏幕循环关闭/打开时停止。
我的编码器架构源自出色的CameraToMpegTest示例,并添加了将相机帧显示到 GLSurfaceView(请参阅下面的 Github 链接)。我目前正在使用两种状态的解决方案执行后台录制:
当托管 Activity 位于前台时,在每次调用
GLSurfaceView.Renderer
's时编码一个视频帧onDrawFrame
。这使我可以突发访问 GLSurfaceView 的 EGL 状态,以免阻塞排队到渲染器线程的其他事件。当宿主 Activity 进入后台时,
onDrawFrame
在循环内的另一个后台线程上停止编码和编码帧。此模式与 CameraToMpegTest 示例相同。
但是,如果屏幕关闭,GLSurfaceView 的 EGLContext 会丢失,并且onSurfaceCreated
会发生新的调用。在这种情况下,我们必须重新创建连接到 MediaCodec 的输入 Surface 的 EGL 窗口表面。不幸的是,这第二次调用eglCreateWindowSurface
产生:
在调用之前,我释放了所有连接到 Android Surface 的 EGL 资源。
有没有办法交换连接到 MediaCodec 输入 Surface 的 EGLSurface?
更新我将这里学到的经验应用到基于 MediaCodec 和 MediaMuxer 类的 Android 视频 sdk 中。希望能帮助到你!
android - Android MediaCodec - 每帧的长处理
编辑,因为我第一次不清楚:
我正在尝试使用 android MediaCodec 从现有视频文件(videoBefore.MP4)中获取每一帧,处理帧(如模糊),然后将每一帧编码为一个新的视频文件(videoAfter.MP4)。
新视频的持续时间必须与第一个视频相同。
只有一个条件:
每一帧都应该无限时间处理,这意味着10秒的视频可能需要1分钟的处理时间。
到目前为止,我只看到了可以实时完成的快速处理(如蓝移)的示例。
有没有办法从视频中抓取帧,然后“花时间”处理它,并且仍然以相同的帧速率或帧时序保留新视频?
*如果我也能保留音频可能会更好——但框架才是最重要的。
谢谢!
android - MediaCodec.dequeInputBuffer / dequeOutputBuffer 处的 IllegalStateException
我正在尝试将 PNG 文件转换为单片视频剪辑,因此只是为了启动一个项目。
我有实现它的代码是:-
这是异常日志:-
当试图运行 Emulator Api Level 19 时:
但是,在 Galaxy Tab 3(设备)上运行时:
参考资料,据我开始这个项目: -
提前致谢。
java - 使用 Mediacodec 解码并使用 OpenCV
我正在开发使用 OpenCV 的 android 应用程序。
我有 mp4 视频文件,我需要从中读取 300 帧 1920x1080 并对其进行一些图像处理操作。
经过大量搜索后,我发现最后只有这个例子。
我的问题是我需要做一件简单的事情,我只想读取帧并将它们保存在设备内存中,或者只是将它们转换为 OpenCV 矩阵。
这是我的尝试(最后解释):
在此示例中,我读取了帧并将它们显示为 Surface。
为了将其保存为位图/矩阵或将其保存在设备中,我需要更改什么?
谢谢
android-camera - 用于同步摄像头的 MediaCodec
我正在使用 MediaCodec API 开发同步摄像机流和录制。我想合并来自相机的帧并提供给渲染以及 Mediacodec 以记录为表面。我不想创建多个 EGLContext 而是应该使用相同的。我以 Bigflake 媒体编解码器示例作为参考,但我不清楚这是否可能。还有如何绑定多个纹理?因为我们需要两个相机的两个纹理。您的宝贵意见将帮助我进一步进步。目前我被卡住了,不清楚下一步该怎么做。
问候内哈尔
android - Nexus 5 上的 GLSurfaceView 帧速率问题
我有一个示例应用程序(完整源代码),它使用 MediaCodec 对相机帧进行编码,同时在 GLSurfaceView 上显示它们。
Systrace 确认每秒进行 30 次绘图调用:
但是,屏幕记录(.mp4、YouTube)显示明显的帧速率要低得多。
简而言之,我的编码和显示循环执行以下操作:
- 使 MediaCodec Surface 输入 EGL Context 当前
- 将相机帧绘制到 MediaCodec EGL 表面
- 使 GLSurfaceView EGL Context 当前
- 将相同的相机帧绘制到 GLSurfaceView
在 Galaxy Nexus LTE 和 Nexus 7(均采用 AOSP 4.4)上,应用程序按预期运行。到目前为止,只有 Nexus 5 在绘制到屏幕的帧数和明显的帧数之间存在这种差异......
我祈祷我没有疯。
android - SurfaceTexture updateTexImage 以共享 2 EGLContexts - Android 4.4 上的问题
我指的是如何将相机的预览帧直接编码为 mp4 文件的这个优秀示例:http: //bigflake.com/mediacodec/CameraToMpegTest.java.txt
我采用了我也想在屏幕上呈现预览图像的方式的代码。因此,我得到了类似 GLTextureView 的东西,它有自己的 EGLContext。当我为编码器渲染创建 EGLContext 时,此 Context 然后用作共享 EGLContext:
在我的渲染循环中,我遵循了 fadden 的提示......对于每一帧我都执行以下操作:
- 首先,我使用 awaitNewImage() 等待新图像到达 SurfaceTexture
- 然后我将 GLTextureView 的上下文设置为当前并在其上渲染框架
- 之后,我将编码器上下文设置为当前并在其上渲染帧
这看起来像这样:
当我只在装有 Android 4.3 的 Nexus 4 上测试它时,这效果很好。
然而,由于我得到了带有 Android 4.4 的新 Nexus 5,编码器每秒只能从 SurfaceTexture 获得 2 个不同的帧......但是这 2 个帧被重复绘制......所以他对同一帧进行了 15 次编码。尽管帧被正确渲染到我的 GLTextureView 每秒 30 个不同的帧。我首先认为这可能是 Nexus 5 的问题 - 所以我将另一个 Nexus 4 更新到 Android 4.4 ......但现在在 Nexus 4 上也是如此。
我玩了一会儿——最后我能够通过在切换 SurfaceTexture 时将它们分离并重新附加到不同的上下文来解决问题。这看起来像这样:
我现在的问题是:这是正确的方法吗?老实说,我认为当我使用共享上下文时,不需要重新附加 SurfaceTexture。此外,重新附加需要相当长的时间......每帧 3-6 毫秒,12 毫秒的窥视,这可以更好地用于渲染。我在这里做/理解错了吗?为什么它在带有 4.3 的 Nexus 4 上像魅力一样工作而无需重新附加 SurfaceTexture?
android - 无法使用 MediaMuxer 混合音频文件和视频文件?
我正在开发一个记录屏幕视频和音频的 Android 应用程序。
我录制了这 2 个文件:mp3 音频文件和 mp4 视频文件(没有声音)。
现在我想混合它们并创建一个新的 mp4 视频文件(带声音)。从 Android 4.3 开始,Google 建议使用MediaMuxer
该类来混合流音频和视频。我试过很多次都没有成功。
有什么解决方案可以解决我与MediaMuxer
Google 的 API 相关的问题吗?任何帮助将不胜感激。
android - 使用 MediaCodec 和 MediaExtractor 对视频进行解码和编码
我需要将视频解码为一系列位图,以便我能够修改它们,然后将它们压缩回 android 中的视频文件。
我计划通过使用getFrameAtTime
并将其保存到图像序列来管理它。然后我可以修改序列中的图像并将其编码回电影。但我有两个问题:
- 首先,当我读到它时,它
getFrameAtTime
是用于创建缩略图并且不能保证返回正确的帧。这使得视频滞后。 - 其次,保存图像并读取它需要很长时间。
我读到使用 MediaExtractor 进行解码的正确方法,这很好,但我只有示例将其直接呈现为surfaceView
. 我有什么办法可以将其转换outputBuffer
为位图吗?
我需要它来让它与 16 及以上的 api 级别一起工作。
java - MediaCodec H264 编码器不适用于 Snapdragon 800 设备
我使用 Android 的 MediaCodec API 编写了一个 H264 流编码器。我在大约十种具有不同处理器的不同设备上对其进行了测试,并且在所有设备上都可以正常工作,除了支持 Snapdragon 800 的设备(Google Nexus 5 和 Sony Xperia Z1)。在这些设备上,我得到了 SPS 和 PPS 以及第一个关键帧,但之后 mEncoder.dequeueOutputBuffer(mBufferInfo, 0) 只返回 MediaCodec.INFO_TRY_AGAIN_LATER。我已经尝试了不同的超时、比特率、分辨率和其他配置选项,但无济于事。结果总是一样的。
我使用以下代码来初始化编码器:
其中选择的颜色格式是:
我通过做得到数据
谢谢你的帮助!