gpt4 book ai didi

android - native_window_api_connect 返回错误 : Invalid argument (-22)

转载 作者:塔克拉玛干 更新时间:2023-11-02 18:52:32 31 4
gpt4 key购买 nike

我正在使用 MediaCodec API 编写视频播放器应用程序。在视频解码开始之前,我必须显示空白屏幕。所以我使用以下代码来显示空白屏幕。

Canvas c=null;
c = surfaceView.getHolder().lockCanvas();
c.drawColor(Color.BLACK);
surfaceView.getHolder().unlockCanvasAndPost(c);

此后视频解码将开始。但是在配置时

videoDecoder.configure(format, surfaceView.getHolder().getSurface(), null, 0);

它给出以下错误

02-03 03:52:37.542: E/MediaCodec(9655): native_window_api_connect returned an error: Invalid argument (-22)
02-03 03:52:37.542: E/Video Decoder Configuration(9655): java.lang.IllegalStateException

所以我的应用程序因该错误而崩溃。没有那个空白屏幕代码解码器工作正常。我该如何解决这个问题?

最佳答案

这是我的理论,基于对框架代码的快速浏览。

Canvas 锁定操作(最终)调用 Surface::lock() ( code here )。那有一段代码说:

if (!mConnectedToCpu) {
int err = Surface::connect(NATIVE_WINDOW_API_CPU);

这是将“CPU 生产者”(即在 CPU 上运行并生成图形数据的代码)连接到提供给 Surface 的缓冲区队列的生产者端。该生产者未在 unlockAndPost() 中断开连接。实际上,您可以在 Surface 析构函数中找到断开连接调用,这对您来说有点晚了。

一个缓冲区队列中不能有两个生产者,因此当您将 Surface 交给 MediaCodec 解码器时,它无法连接。

我相信你有几个选择:

  1. 使用 OpenGL ES 空白表面。当您销毁 EGLSurface 时,它将断开连接。这需要设置 EGL/GLES 并正确获取 EGL 发布代码。
  2. 使用不同于在 SurfaceView 本身上绘制的方法放置一个空白矩形(h/t 我的办公室伙伴)。

对于方法 #2,您只需要第二个 View (可能是 ImageView),其位置和尺寸与 SurfaceView 相同,并用不透明的黑色填充它。 SurfaceView 层始终位于其他所有内容之下(假设您尚未将其配置为位于顶部),因此 UI 元素将在其之上绘制。当开始播放电影时,您禁用另一个 View 。

更新:您现在可以在 Grafika 中查看方法 #1| .在“播放电影 (SurfaceView)” Activity 中,它创建一个 EGL 上下文,清除表面,然后销毁上下文。 (有必要立即销毁 EGL 上下文和表面以避免“双生产者”问题。)

关于android - native_window_api_connect 返回错误 : Invalid argument (-22),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21526989/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com