问题标签 [grafika]
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.
java - 使用 google/grafika 编码视频文件时延迟帧
我正在使用google/grafika 的示例进行解码、转换和编码以归档视频剪辑。转换是缩小和转换,它是通过存储在Texture2dProgram
. 我的主要活动是基于CameraCaptureActivity
. 问题是我同时将两个视频并排放置在单个纹理上。我想将其中一个延迟给定数量的帧。另请注意,编码时我不需要显示预览。
到目前为止,我最好的想法是在推进帧的同时更改时间戳。在TextureMovieEncoder
中,我正在发送有关帧的信息,包括它们必须放置在结果视频中的时间戳。它发生在frameAvailiable()
,我一次发送有关两个帧的信息(左和右)。这个想法是增加其中一个的时间戳。问题是结果视频失真,所以我不知道我的方法是否可行。TextureMovieEncoder
贴在下面。
我的想法可行吗?还是有更好/正确的方法来延迟其中一个视频?
android - 如何限制项目 grafika 圆形连续摄像机的最大秒数?
我们可以设置一个MAX_LENGTH
值。该值大约限制了记录..有时它可以加倍。所以假设我将值设置MAX_LENGTH
为 15,然后启动应用程序并开始录制,有时它会超过该限制并达到 30!该限制机制已损坏..有一种方法可以对其进行硬限制,使其永远不会超过MAX_LENGTH
?谢谢
android - 在 Grafika 中为每一帧渲染一次视频效果 - CameraCaptureActivity
我指的是演示应用Grafika,其中CameraCaptureActivity录制视频,同时显示应用效果的实时预览。
在 CameraCaptureActivity 中录制时,应用到来自相机的帧的任何效果都会执行两次。
一次用于预览,一次用于将视频保存到文件中。
由于预览的同一帧被保存到文件中,如果可以只执行一次,它将节省大量处理。
帧的渲染直接发生在两个表面上,一个是 GLSurfaceView(用于预览),另一个是 MediaCodec(保存部分)。
有没有办法只渲染一次 OpenGL 效果?
如果我可以将一个表面的内容复制到另一个表面,那就太好了。
有没有办法做到这一点?
java - 同时解码两个 4K 视频
我想同时解码和播放两个视频。我的代码不是很复杂,你可以看到下面的解码器配置部分。它基于google/grafika的 MoviePlayer。
这适用于高达 1080p 的视频,但是当我尝试播放 4K 视频时,第二个解码器无法配置并出现错误:
如果我只留下一个解码器,即使是 4K 视频也能正常工作。我在这个问题中找到了一些讨论,但我不确定它是否与我的问题有关。我可以确认这发生在三星 Galaxy S6 和三星 Galaxy Note 4
上。有没有办法让两个解码器处理 4K 视频?
java - SurfaceTexture.getTimestamp() 在播放过程中返回 0
最近我在 Android 5.0.2 (API 21) 上遇到了一个奇怪的问题。我的应用程序使用 SurfaceTexture 来显示视频。播放机制主要基于google/grafika的 CameraCaptureAvtivity,但视频源是解码的 .mp4 电影文件而不是相机。该应用程序运行良好,直到我在装有 Android 5.0.2 的 Galaxy S6 上运行它(在此之前我成功使用了 4.4.2 和 4.4.4 的设备)。问题是每次我尝试从 SurfaceTexture 接收时间戳时getTimestamp()
,该方法返回 0,尽管播放很好。在我之前提到的其他设备上,时间戳是正确的。
有人可以告诉我这是否可能是Android错误吗?有什么办法可以解决吗?
android - 在使用 MediaCodec 为 Grafika 的“连续捕获”活动进行编码之前裁剪视频
我正在学习 Grafika 的“连续捕获”活动,它是关于使用 MediaCodec 录制视频的。
活动源代码位于https://github.com/google/grafika/blob/master/src/com/android/grafika/ContinuousCaptureActivity.java
该程序使用一个 SurfaceTexture obj 从相机接收数据,并使用这个 SurfaceTexture obj 创建 2 个 EGLSurface obj,一个 EGLSurface obj 将数据提供给 MediaCodec,另一个将数据提供给 SurfaceView 用于相机预览。MediaCodec 将数据编码为 h264 数据,MediaMuxer obj 将 h264 数据写入 mp4 文件。
但是有一个问题,相机支持的预览尺寸是landspace(宽>高)如1920*1080、1440*1080、720*480等。通常我们在录制视频时手机是纵向的,所以我们应该使用API:Camera.setDisplayOrientation(90) 将图片旋转为纵向,然后录制纵向视频。
但是我想用手中的手机人像录制横向视频,我必须从相机中裁剪每一帧。我的方法是把每一帧画面的底部和顶部都剪掉,保留画面的中间,那么左边的画面就是横向的了。
但是我对opengl不熟悉,我不知道如何裁剪SurfaceTexture数据。有擅长opengl的人能给我一些帮助吗?
android - grafika 的 EglCore.release() 导致应用程序在 GT-I9500 上终止
我参考了grafika的ContinuousCaptureActivity来实现一个使用MediaCodec录制视频的demo。演示在大多数情况下运行良好,但在我的 GT-I9500 设备上按下后退键时崩溃(此崩溃无法检测,因为我们只是假设活动被破坏,我使用“adb shell ps”来检查演示进程的存在)。然后我反复检查我的源代码,发现我的代码和grafika的ContinuousCaptureActivity几乎一样。所以我做了以下事情:
我在我的GT-I9500设备上安装了grafika的apk并启动了ContinuousCaptureActivity,然后我按了手机的返回键,但应用程序没有崩溃,结果grafika运行良好。
我再次检查了我的代码,没有发现任何可疑之处。
我创建了一个新的 android 项目,并将 ContinuousCaptureActivity.java 和其他必要的文件(如 AndroidManifest.xml、activity_continuous_capture.xml 等)从 grafika 复制到新项目中。我修改了 AndroidManifest.xml 以使 ContinuousCaptureActivity 成为主要活动。我编译了代码并在我的 GT-I9500 设备上安装了 apk。同样的事情发生了,我按下后退键后应用程序崩溃了!!!
我真的对这个问题感到困惑,为什么 grafika 工作正常但新项目中的相同代码却崩溃了?无论如何,我相信我的演示崩溃有一个解决方案,因为 grafika 工作得很好。有人可以给我一些建议吗?
我可以提供的信息如下:
我调试了应用程序并找到了导致崩溃的确切代码,代码是https://github.com/google/grafika/blob/master/src/com/android/grafika/gles/EglCore.java#L191
崩溃非常惨烈,没有生成墓碑文件,并且 adb 日志受到限制:
06-15 14:39:33.853 I/ActivityManager(771): 进程 com.example.grafikaaa (pid 13138) (adj 1) 已经死亡。
06-15 14:39:33.853 W/ActivityManager(771):强制删除 ActivityRecord{42a876c8 u0 com.example.grafikaaa/.ContinuousCaptureActivity}:应用程序死亡,没有保存状态......
06-15 14:39:33.903 D/Zygote (209): 进程 13138 由信号 (11) 终止
- grafika 的 GlesInfoActivity 显示的我的设备信息如下:
android - 如果我使用grifika的ContinuousCaptureActivity中的预览方式,相机预览的范围会更小
我们知道,当相机预览比例设置为4:3
而不是时,我们将在相同距离处获得更大的预览场,16:9
具体如下:
但是我在使用opengl使用android相机预览时遇到了一个问题,这是下面提到的第二种方式。
实现相机预览有两种方式:
- 没有opengl的传统方式,只需使用
Camera.setPreviewTexture(SurfaceTexture texture)
或Camera.setPreviewDisplay(SurfaceHolder holder)
ContinuousCaptureActivity
使用opengl的方式,我们用API渲染预览图swapBuffers()
。
第一种方法还可以,如果预览比例从16:9变成4:3,我会发现预览区域变大了。
但是,第二种方式在某些安卓手机中不行,预览比例改变时预览字段保持不变,并且预览字段比第一种方式小,比例为4:3。我坚持这是一个错误,我非常想解决这个问题,谁能给我一些建议?
android - Grafika的saveFrame制作的图片是倒置的
我根据Continuous capture activity写了一个demo。我想将视频的第一帧保存为jpeg文件,所以我使用了Grafika已经准备好的saveFrame()函数。函数源码如下: https ://github.com/google/grafika/blob/master/src/com/android/grafika/gles/EglSurfaceBase.java
但是我发现制作出来的jpeg图片是颠倒的,这不是我想要的。
在我保存框架之前,有没有办法旋转框架?
旋转位图不是一个优雅的解决方案,因为我们可能会遇到一些其他情况,例如视频聊天。视频的每一帧都被发送到远程对等体,然后远程人将看到一个颠倒的视频。所以我们应该在编码之前旋转每一帧。
android - Android 视频精准搜索
我正在努力使用 MediaExtractor 进行精确搜索seekTo()
。虽然我可以毫无问题地寻求同步帧,但我想寻求特定的时间。这个问题让我想到了一些如何做到这一点的想法,但我不确定它们是否有效。基本上,我必须寻找最接近的前一个同步帧,然后advance()
是提取器,直到达到目标时间。该过程中的每一帧都将被馈送到解码器,即第一个 I 帧和其余的 P 帧。这是相关的代码片段(基于google/grafika的 MoviePlayer):
正如您可以想象的那样,通常我会排队大量的帧,但现在我对内存消耗或最终滞后感到满意。问题是该dequeueInputBuffer()
方法仅在循环中工作一段时间,最终停留在返回 -1,因此根据文档,这意味着缓冲区不可用。如果我将其更改TIMEOUT_USEC
为-1
,我将得到无限循环。
有人可以告诉我这种方法是否正确,或者为什么在某些时候我无法访问inputBuffer
?