问题标签 [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 投票
0 回答
1260 浏览

android - 带声音的 Android 视频循环缓冲区

我正在使用 Google 的开源示例:Grafika。我正在使用它的ContinuousCaptureActivity.java这个 Activity 演示了 CircularBuffer 的实现,但生成的视频文件中没有包含音频。

我想在此 Activity 中添加音频录制功能,并以相同的 CircularBuffered 方式将录制的音频添加到视频中。

为了实现这一点,我探索了在 4.3+ 版本中引入的 MediaCodec 库。我还使用 MediaMuxer 来捕获视频和音频流并将它们混合成一个视频。

但是,我不确定如何在ContinuousCaptureActivity.java课堂上实现录音功能。非常感谢任何帮助。

0 投票
0 回答
2002 浏览

android - 视频音频复用问题(java.lang.IllegalStateException:无法停止复用器)

我正在制作一个应用程序来录制视频,而不使用默认的录像机。为了制作视频,我使用了 MediaMuxer。音频和视频录制在不同的线程上完成。

当我停止录制时,应用程序随机崩溃,并且日志显示

java.lang.IllegalStateException:无法停止多路复用器

当我尝试在不添加音轨的情况下录制视频时,它工作正常,但是当音频和视频轨道都添加到多路复用器时,它会出现这个问题。

我指的是用于视频录制的grafika cameracaptureactivity

我无法确定问题是由于线程还是某些同步问题引起的。有人可以帮我解决这个问题。

0 投票
2 回答
2305 浏览

android - 在 Android 中创建位图之前从 Bytebuffer 翻转 openGL 纹理

我正在使用依赖于 Google 的 Grafika 存储库的实时流 API。我正在使用 Grafika EGLSurfaceBase 的 saveFrame 方法来允许用户在流式传输时捕获他的视频的静止图像。

https://github.com/google/grafika/blob/master/src/com/android/grafika/gles/EglSurfaceBase.java

实际捕获工作但显然在某些相机方向上图像被翻转。

我发现了很多与取自 OpenGL 纹理的倒置位图相关的问题——但大多数问题似乎是指绘制的图像并依赖于其中一个:

a) 在 OpenG 中翻转纹理。但就我而言,我正在使用实时流 API,因此翻转纹理以捕获图像实际上可能也会翻转视频流上的图像捕获。

或者

b) 在基于资源生成位图之后翻转位图。就我而言,我没有资源,我正在从字节缓冲区创建位图,并且不想复制它来翻转它。

这是 API 具有的基本 EGLSurfaceBase 方法 - 我会将相机方向传递给它,但我的问题是:

我首选的解决方案是找到一种在 BMP.createbitmap 之前(或同时)翻转图像的方法。例如,我可以使用矩阵来翻转 glReadPixels 对像素的读取吗?

另一个注意事项/想法:也许在创建后翻转位图的成本是微不足道的,因为这依赖于用户交互,它不会经常发生而导致内存错误?

0 投票
0 回答
48 浏览

android - 未创建 Android OpenGL 着色器

我正在使用 OpenGL 对视频应用一些效果。这发生在两个地方,一个是在播放视频时,另一个是在将此视频保存为单独的文件时。预览部分(播放视频)工作正常,但对于视频保存部分,不会创建着色器。

创建着色器调用,

大多数时候返回 0,偶尔会创建着色器。

我是 OpenGl 的新手,但据我了解,我认为创建着色器没有任何依赖关系。有人可以帮我解决这个问题。

0 投票
2 回答
580 浏览

android - Grafika 的 CameraCaptureActivity - 相机预览在预览尺寸变化时失真

我参考了Grafika 的 CameraCaptureActivity来录制视频,同时显示相机预览。

我对代码所做的更改(相关)是 -

用户单击一个按钮启动PreferencesActivity,选择首选的相机分辨率(存储widthheight值),然后单击“返回”按钮返回到CameraCaptureActivity.

openCamera方法中-而不是硬编码widthheight我从SharedPreferences

AspectFrameLayout's属性就是这样设置的android:background="@android:color/holo_blue_bright"。所以预览是匹配的大小AspectFrameLayout

当尺寸从较大的分辨率更改为较小的分辨率时,通常会出现此问题。

在较小的屏幕中(HTC One M7 / Xperia SP) HTC 中的扭曲相机预览

在大屏幕中(三星 Galaxy Tab S / Nexus 9) - 三星 Tab S 中的失真相机预览

我注意到发生这种情况是因为onSurfaceChanged被调用了两次。第一次是错误的值,width第二height次是正确的值。

但是,如果我离开活动并返回它而不进行任何更改,布局看起来很好。(就像在不更改分辨率的情况下转到PreferencesActivity并单击“返回”。)

我在AndroidManifest.xml-

编辑:只有预览会出现此问题。录制的视频大小正确。

编辑 2:这是我的 layout.xml

我确信我传递了正确的值来设置视图的宽度和高度,因为如果我离开活动并返回它而不进行任何更改,预览设置正确。(就像去另一个活动并单击“返回”返回CameraCaptureActivity。)

0 投票
1 回答
208 浏览

android - Grafika CameraCaptureActivity 不工作

我正在尝试在我的 Galaxy S3 中测试这个样本,一切似乎都运行良好,但是当我尝试播放录制的文件时,没有播放器可以播放该文件。我将视频发送到我的计算机并尝试使用 VLC、gom 播放器等,但总是收到类似“无法识别输入格式”的错误文件大小正确。怎么了?

编辑:我在moto G中测试了相同的样本并且工作正常。可以是银河 S3 相关的问题吗?

谢谢

0 投票
0 回答
330 浏览

android - 使用 MediaCodec 使用 GLSurfaceView 记录 GL 渲染时的帧速率(间隔)问题

我一直在开发我们应用程序的记录组件,它使用 MediaCodec 和 Muxer 在 GLSurfaceView 上记录 GL 渲染。我找到了 fadden 的一组很好的例子(比如bigflake和 Grafika ......非常感谢 fadden),并尝试了这些东西。我基于 Android Breakout 的游戏录制模型构建了一个录制器,因为我们的应用程序使用 GLSurfaceView 来进行渲染。

它似乎在我的 Nexus 7 上运行良好(2013 年 4.4.2 和 5.0.2)。我能够录制渲染的屏幕,并且那些编码的 MP4 在其他设备上播放得很好。然而,当涉及到更复杂的渲染时,它开始丢帧。好吧,这并不复杂,因为渲染帧只需要大约 4 毫秒。所以,我一直在试图找出问题的根源。

我的伪代码与 Android Breakout Recorder 非常相似。OnDrawFrame() 如下所示。

我尝试测量逐行调用的性能,发现在 Nexus 7 上 recorder.swapBuffers() 大约需要 10 毫秒。移动缓冲区可能需要很长时间,我认为这是合理的。另一个比预期花费更长的时间是 recorder.makeCurrent(),大约需要 10 毫秒。

我还试图测量 onDrawFrame() 的调用间隔。当录制关闭时(recordThisFrame() 设置为假),我一直在得到 16.7 ~ 17 毫秒,这是预期的。当 recordThisFrame() 设置为在 true 和 false 之间交替记录每隔一帧时,我一直在 22 ~ 25 ms(录制时)和 4~10 ms 左右。即使将 drawFrame() 调用更改为简单的 glclear(),我也得到了相同的结果。我在 Android Breakout Recorder(fadden 的原始代码)上尝试了这个,也得到了相同的结果。

我在 Grafika 中尝试了“使用 FBO 记录 GL 应用程序”活动,我发现即使在录制的情况下,它的 16-17 毫秒间隔也更加一致。我很想用 SurfaceView 替换 GLSurfaceView,就像在 Grafika 的 Record GL 应用程序中一样,但是这种更改目前似乎不是一个可行的选择。

makeCurrent() 调用成本高吗?有没有人遇到类似的间隔问题?任何想法将不胜感激。

0 投票
0 回答
142 浏览

android - Android:在 Moto G2 上应用 OpenGL 效果后录制的视频是黑色的

我正在使用 OpenGL 对视频应用视觉效果。效果分别应用于视频预览和保存到文件的部分,与在GrafikaCameraCaptureActivity中的工作方式相同。

这在 Nexus 5 上运行良好。
而在 Moto G2 上,预览运行良好,但保存的视频只有黑框。
每个帧的 OpenGL 效果应用部分发生在预览和保存的公共类中 (尽管它们是单独的对象)

我已经验证了发送到 OpenGL 程序的数据,它们似乎具有有效数据。

有没有人遇到过这样的问题?

0 投票
1 回答
626 浏览

java - 基于 google/grafika 示例将 SurfaceView 捕获到视频文件中

我想从文件中加载视频,对其进行一些转换并将其渲染回文件中。所述变换主要是两个视频在时间上重叠和移动其中一个。Grafika有一些与此问题相关的示例。RecordFBOActivity.java 包含一些用于从表面渲染视频文件的代码。我很难改变两件事:

  • 我需要渲染先前解码和转换的视频,而不是渲染运动中的基元
  • 我想尽可能快地将表面渲染到文件,而不是与播放一起

到目前为止,我唯一的成功是加载了 .mp4 文件并向 PlayMovieActivity.java 添加了一些基本的搜索功能。

在我的研究中,我遇到了这些示例,它们也使用生成的视频。我没有发现它们很有用,因为我无法将生成的视频与文件中的解码视频交换。

是否可以修改 RecordFBOActivity.java 的代码,以便它可以显示文件中的视频而不是生成的动画?

0 投票
1 回答
1839 浏览

android - 是否可以/如何将 MediaCodec 解码帧直接馈送到 MediaCodec 编码器?

我的目标是拼接来自多个视频文件的视频片段。片段由任意开始时间和结束时间定义。最初我想使用像 mp4parser 这样的库来完成它,但它只能在同步(IFRAME)点切割流,而我需要更高的精度。

我的方案是从文件中提取编码流 -> 解码 -> 编码 -> 将结果复用到 mp4 文件中。现在通常代码可以工作,但结果视频是白噪声。在 Nexus-S 和 Galaxy-S3 上测试。我的代码是几个例子的组合:

  • 基于 MoviePlayer.java 读取之前录制的文件
  • 解码-编码:DecodeEditEncodeTest.java
  • 多路复用视频流到 mp4 - 又一个例子,这里不相关

我想简化示例,因为我不需要在中间处理帧。我试图将缓冲区从解码器输出馈送到编码器输入,中间没有 Surface。整个过程在代码运行完成并产生可播放的视频文件的意义上起作用。但是文件的内容是白噪声。

这是将帧从解码器传送到编码器的代码片段。出了什么问题以及如何使其工作?