是否可以在两个进程之间共享 SurfaceTexture,例如 Activity 和 Service?
我想创建一个带有 TextureView 的 Activity,并从一个单独的服务更新它的 SurfaceTexture。
到目前为止,我正在创建一个带有生成的 OpenGL 纹理的 SurfaceTexture(通过 glGenTextures),然后我将这个表面纹理设置到我的 TextureView:
mSurfaceTexture = new SurfaceTexture(texture_id);
mTextureView.setSurfaceTexture(mSurfaceTexture);
在 Activity 上显示此 SurfaceTexture 的相机预览工作正常:
mCamera = Camera.open();
mCamera.setPreviewTexture(mTextureView.getSurfaceTexture());
mCamera.startPreview();
我想做同样的事情,但是从一个单独的服务,将 texture_id 传递给它,比如:
mCamera = Camera.open();
mCamera.setPreviewTexture(new SurfaceTexture(texture_id));
mCamera.startPreview();
原因是我有一个单独的进程调用私有(private) api,需要 SurfaceTexture 来流式传输一些内容,并且这个进程是通过应用程序的 aidl 访问的。
谢谢
最佳答案
系统支持做你想做的事,但我不知道现在的公共(public)API是否可以。
确保我们在同一页面上的一些背景...
Surface 是生产者-消费者对的生产者端。使用 SurfaceTexture,应用程序可以访问两端。渲染到 SurfaceTexture 的 Surface 的任何内容都将转换为 OpenGL ES“外部”纹理。
媒体和显示 API 的工作方式是让消费者创建配对,然后将 Surface 交给应用程序。这就是为什么,如果您创建一个 SurfaceView,在 surfaceCreated() 回调触发之前您不能使用该 Surface —— BufferQueue 对象由系统图形合成器 (SurfaceFlinger) 创建,而生产者side 通过 Binder IPC 传递到您的应用程序。由 mediaserver 进程创建的 MediaCodec 编码器的 Surface 输入也是如此。
您可以将从 SurfaceView 或 SurfaceTexture 获得的 Surface 传递给产生输出的对象,例如相机预览或 MediaCodec 解码器。在引擎盖下,这些通过 IPC 将 Surface 传递到 mediaserver 进程。随着帧的产生,图形缓冲区通过引用传递给消费者。 SurfaceFlinger 显示它从 SurfaceView 获得的帧,SurfaceTexture 只是将它们转换为纹理。
因此,您要做的是在应用程序中创建一个 SurfaceTexture,为其构造一个 Surface,然后将该 Surface 传递给您的服务。您的服务会生成帧并将它们写入 Surface,Surface 会通过 IPC 将它们发送给您应用中的 SurfaceTexture 使用者,后者会将它们转换为 GLES 纹理。
我还没有尝试通过 AIDL 传递 Surface,所以我不知道它是否真的有效。
在进程之间传递纹理 ID 是行不通的。如果在创建第二个上下文时将第一个上下文作为参数传递,则可以从两个不同的 EGLContext 访问纹理,但我认为这不会跨进程工作。
有关系统工作方式的更多详细信息,请参阅 architecture doc .
关于Android 在两个进程之间共享 SurfaceTexture,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33222621/
exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby中使用两个参数异步运行exe吗?我已经尝试过ruby命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何rubygems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除
我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此
在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',
我正在编写一个gem,我必须在其中fork两个启动两个webrick服务器的进程。我想通过基类的类方法启动这个服务器,因为应该只有这两个服务器在运行,而不是多个。在运行时,我想调用这两个服务器上的一些方法来更改变量。我的问题是,我无法通过基类的类方法访问fork的实例变量。此外,我不能在我的基类中使用线程,因为在幕后我正在使用另一个不是线程安全的库。所以我必须将每个服务器派生到它自己的进程。我用类变量试过了,比如@@server。但是当我试图通过基类访问这个变量时,它是nil。我读到在Ruby中不可能在分支之间共享类变量,对吗?那么,还有其他解决办法吗?我考虑过使用单例,但我不确定这是
在Cooper的书BeginningRuby中,第166页有一个我无法重现的示例。classSongincludeComparableattr_accessor:lengthdef(other)@lengthother.lengthenddefinitialize(song_name,length)@song_name=song_name@length=lengthendenda=Song.new('Rockaroundtheclock',143)b=Song.new('BohemianRhapsody',544)c=Song.new('MinuteWaltz',60)a.betwee
我正在检查一个Rails项目。在ERubyHTML模板页面上,我看到了这样几行:我不明白为什么不这样写:在这种情况下,||=和ifnil?有什么区别? 最佳答案 在这种特殊情况下没有区别,但可能是出于习惯。每当我看到nil?被使用时,它几乎总是使用不当。在Ruby中,很少有东西在逻辑上是假的,只有文字false和nil是。这意味着像if(!x.nil?)这样的代码几乎总是更好地表示为if(x)除非期望x可能是文字false。我会将其切换为||=false,因为它具有相同的结果,但这在很大程度上取决于偏好。唯一的缺点是赋值会在每次运行
我正在阅读一本关于Ruby的书,作者在编写类初始化定义时使用的形式与他在本书前几节中使用的形式略有不同。它看起来像这样:classTicketattr_accessor:venue,:datedefinitialize(venue,date)self.venue=venueself.date=dateendend在本书的前几节中,它的定义如下:classTicketattr_accessor:venue,:datedefinitialize(venue,date)@venue=venue@date=dateendend在第一个示例中使用setter方法与在第二个示例中使用实例变量之间是
📢博客主页:https://blog.csdn.net/weixin_43197380📢欢迎点赞👍收藏⭐留言📝如有错误敬请指正!📢本文由Loewen丶原创,首发于CSDN,转载注明出处🙉📢现在的付出,都会是一种沉淀,只为让你成为更好的人✨文章预览:一.分辨率(Resolution)1、工业相机的分辨率是如何定义的?2、工业相机的分辨率是如何选择的?二.精度(Accuracy)1、像素精度(PixelAccuracy)2、定位精度和重复定位精度(RepeatPrecision)三.公差(Tolerance)四.课后作业(Post-ClassExercises)视觉行业的初学者,甚至是做了1~2年
最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路
我从用户Hirolau那里找到了这段代码:defsum_to_n?(a,n)a.combination(2).find{|x,y|x+y==n}enda=[1,2,3,4,5]sum_to_n?(a,9)#=>[4,5]sum_to_n?(a,11)#=>nil我如何知道何时可以将两个参数发送到预定义方法(如find)?我不清楚,因为有时它不起作用。这是重新定义的东西吗? 最佳答案 如果您查看Enumerable#find的文档,您会发现它只接受一个block参数。您可以将它发送两次的原因是因为Ruby可以方便地让您根据它的“并行赋