问题标签 [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.

0 投票
1 回答
517 浏览

java - 使用 google/grafika 编码视频文件时延迟帧

我正在使用google/grafika 的示例进行解码、转换和编码以归档视频剪辑。转换是缩小和转换,它是通过存储在Texture2dProgram. 我的主要活动是基于CameraCaptureActivity. 问题是我同时将两个视频并排放置在单个纹理上。我想将其中一个延迟给定数量的帧。另请注意,编码时我不需要显示预览。

到目前为止,我最好的想法是在推进帧的同时更改时间戳。在TextureMovieEncoder中,我正在发送有关帧的信息,包括它们必须放置在结果视频中的时间戳。它发生在frameAvailiable(),我一次发送有关两个帧的信息(左和右)。这个想法是增加其中一个的时间戳。问题是结果视频失真,所以我不知道我的方法是否可行。TextureMovieEncoder贴在下面。

我的想法可行吗?还是有更好/正确的方法来延迟其中一个视频?

0 投票
1 回答
158 浏览

android - 如何限制项目 grafika 圆形连续摄像​​机的最大秒数?

我们可以设置一个MAX_LENGTH值。该值大约限制了记录..有时它可以加倍。所以假设我将值设置MAX_LENGTH为 15,然后启动应用程序并开始录制,有时它会超过该限制并达到 30!该限制机制已损坏..有一种方法可以对其进行硬限制,使其永远不会超过MAX_LENGTH?谢谢

0 投票
1 回答
331 浏览

android - 在 Grafika 中为每一帧渲染一次视频效果 - CameraCaptureActivity

我指的是演示应用Grafika,其中CameraCaptureActivity录制视频,同时显示应用效果的实时预览。

在 CameraCaptureActivity 中录制时,应用到来自相机的帧的任何效果都会执行两次。
一次用于预览,一次用于将视频保存到文件中。

由于预览的同一帧被保存到文件中,如果可以只执行一次,它将节省大量处理。

帧的渲染直接发生在两个表面上,一个是 GLSurfaceView(用于预览),另一个是 MediaCodec(保存部分)。

有没有办法只渲染一次 OpenGL 效果?

如果我可以将一个表面的内容复制到另一个表面,那就太好了。
有没有办法做到这一点?

0 投票
0 回答
775 浏览

java - 同时解码两个 4K 视频

我想同时解码和播放两个视频。我的代码不是很复杂,你可以看到下面的解码器配置部分。它基于google/grafika的 MoviePlayer。

这适用于高达 1080p 的视频,但是当我尝试播放 4K 视频时,第二个解码器无法配置并出现错误:

如果我只留下一个解码器,即使是 4K 视频也能正常工作。我在这个问题中找到了一些讨论,但我不确定它是否与我的问题有关。我可以确认这发生在三星 Galaxy S6 和三星 Galaxy Note 4

上。有没有办法让两个解码器处理 4K 视频?

0 投票
0 回答
880 浏览

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错误吗?有什么办法可以解决吗?

0 投票
1 回答
6038 浏览

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的人能给我一些帮助吗?

0 投票
0 回答
186 浏览

android - grafika 的 EglCore.release() 导致应用程序在 GT-I9500 上终止

我参考了grafika的ContinuousCaptureActivity来实现一个使用MediaCodec录制视频的demo。演示在大多数情况下运行良好,但在我的 GT-I9500 设备上按下后退键时崩溃(此崩溃无法检测,因为我们只是假设活动被破坏,我使用“adb shell ps”来检查演示进程的存在)。然后我反复检查我的源代码,发现我的代码和grafika的ContinuousCaptureActivity几乎一样。所以我做了以下事情:

  1. 我在我的GT-I9500设备上安装了grafika的apk并启动了ContinuousCaptureActivity,然后我按了手机的返回键,但应用程序没有崩溃,结果grafika运行良好。

  2. 我再次检查了我的代码,没有发现任何可疑之处。

  3. 我创建了一个新的 android 项目,并将 ContinuousCaptureActivity.java 和其他必要的文件(如 AndroidManifest.xml、activity_continuous_capture.xml 等)从 grafika 复制到新项目中。我修改了 AndroidManifest.xml 以使 ContinuousCaptureActivity 成为主要活动。我编译了代码并在我的 GT-I9500 设备上安装了 apk。同样的事情发生了,我按下后退键后应用程序崩溃了!!!

我真的对这个问题感到困惑,为什么 grafika 工作正常但新项目中的相同代码却崩溃了?无论如何,我相信我的演示崩溃有一个解决方案,因为 grafika 工作得很好。有人可以给我一些建议吗?

我可以提供的信息如下:

  1. 我调试了应用程序并找到了导致崩溃的确切代码,代码是https://github.com/google/grafika/blob/master/src/com/android/grafika/gles/EglCore.java#L191

  2. 崩溃非常惨烈,没有生成墓碑文件,并且 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) 终止

  1. grafika 的 GlesInfoActivity 显示的我的设备信息如下:
0 投票
1 回答
1611 浏览

android - 如果我使用grifika的ContinuousCaptureActivity中的预览方式,相机预览的范围会更小

我们知道,当相机预览比例设置为4:3而不是时,我们将在相同距离处获得更大的预览场,16:9具体如下:

Android Camera API - 奇怪的缩放效果

但是我在使用opengl使用android相机预览时遇到了一个问题,这是下面提到的第二种方式。

实现相机预览有两种方式:

  1. 没有opengl的传统方式,只需使用Camera.setPreviewTexture(SurfaceTexture texture)Camera.setPreviewDisplay(SurfaceHolder holder)
  2. ContinuousCaptureActivity使用opengl的方式,我们用API渲染预览图swapBuffers()

第一种方法还可以,如果预览比例从16:9变成4:3,我会发现预览区域变大了。

但是,第二种方式在某些安卓手机中不行,预览比例改变时预览字段保持不变,并且预览字段比第一种方式小,比例为4:3。我坚持这是一个错误,我非常想解决这个问题,谁能给我一些建议?

0 投票
2 回答
485 浏览

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图片是颠倒的,这不是我想要的。

在我保存框架之前,有没有办法旋转框架?

旋转位图不是一个优雅的解决方案,因为我们可能会遇到一些其他情况,例如视频聊天。视频的每一帧都被发送到远程对等体,然后远程人将看到一个颠倒的视频。所以我们应该在编码之前旋转每一帧。

0 投票
1 回答
1716 浏览

android - Android 视频精准搜索

我正在努力使用 MediaExtractor 进行精确搜索seekTo()。虽然我可以毫无问题地寻求同步帧,但我想寻求特定的时间。这个问题让我想到了一些如何做到这一点的想法,但我不确定它们是否有效。基本上,我必须寻找最接近的前一个同步帧,然后advance()是提取器,直到达到目标时间。该过程中的每一帧都将被馈送到解码器,即第一个 I 帧和其余的 P 帧。这是相关的代码片段(基于google/grafika的 MoviePlayer):

正如您可以想象的那样,通常我会排队大量的帧,但现在我对内存消耗或最终滞后感到满意。问题是该dequeueInputBuffer()方法仅在循环中工作一段时间,最终停留在返回 -1,因此根据文档,这意味着缓冲区不可用。如果我将其更改TIMEOUT_USEC-1,我将得到无限循环。

有人可以告诉我这种方法是否正确,或者为什么在某些时候我无法访问inputBuffer