Android 如何将实时移动摄像机馈送至计算机?

Android 如何将实时移动摄像机馈送至计算机?,android,image,file,unity3d,Android,Image,File,Unity3d,我正在尝试制作一个简单的运动捕捉系统。我要做的是,我必须让相机(手机)以90度的角度拍摄同一主题。通过这两个摄像头的馈送,我检测到想要的颜色,计算它们的相对3D位置,然后使用blender3D在该位置绘制一个立方体,但这与我的问题无关 现在我的问题是把两部手机的实时数据传输到我的电脑上,然后计算所需的一切。我现在做的是在两部手机上都使用一个名为IP网络摄像头的应用程序,通过内部网发送两部相机的最后一张照片 但问题是在互联网上每秒60帧加载两幅图像的效率非常低。。。(它适用于非常低分辨率的图像,但

我正在尝试制作一个简单的运动捕捉系统。我要做的是,我必须让相机(手机)以90度的角度拍摄同一主题。通过这两个摄像头的馈送,我检测到想要的颜色,计算它们的相对3D位置,然后使用
blender3D
在该位置绘制一个立方体,但这与我的问题无关

现在我的问题是把两部手机的实时数据传输到我的电脑上,然后计算所需的一切。我现在做的是在两部手机上都使用一个名为
IP网络摄像头
的应用程序,通过内部网发送两部相机的最后一张照片

但问题是在互联网上每秒60帧加载两幅图像的效率非常低。。。(它适用于非常低分辨率的图像,但我希望图像具有更高的质量和细节)

然后我有了一个想法。。。我将制作一个移动应用程序,将相机的最后一帧保存在手机上的
.png
中,然后电脑将访问后者。(我甚至不确定这是否可能:))我使用的是
Unity3d
,因为这似乎是一项简单的任务,我不想为了这么简单的事情而学习Android studio

获取相机馈送我设法做到了,但问题是我无法正确保存图像。经过大量的研究,我仍然不知道该怎么办。在何处保存图像以便计算机可以访问?我尝试使用
Application.persistantPath
将其保存到内部存储器中,结果成功了(
Android/data/com.myName.productName/files/savedImage.png
),但我无法用我的计算机访问它(至少我没有成功;没有错误,只是它没有加载图像,可能…)。我使用以下代码保存它:

Texture2D tx2d = new Texture2D(backCam.width, backCam.height); //backCam is the last shot of the back camera, type = WebCamTexture
tx2d.SetPixels(backCam.GetPixels());
tx2d.Apply();

byte[] bytes = tx2d.EncodeToJPG();
Destroy(tx2d);

string path = Application.persistantPath; //This is the problem  
File.WriteAllBytes(path + "/SavedScreen.png", bytes); //Save image
然后我试着把它保存在SD卡上。但我不确定我的SD卡根路径是什么,也不知道如何找到它。我使用此代码查找它:

public static string GetAndroidInternalFilesDir()
{
    string[] potentialDirectories = new string[]
    {
         "/storage/sdcard0",
         "/sdcard",
         "/storage/sdcard1"
    };

    if (Application.platform == RuntimePlatform.Android)
    {
        for (int i = 0; i < potentialDirectories.Length; i++)
        {
            if (Directory.Exists(potentialDirectories[i]))
            {
                return potentialDirectories[i];
            }
        }
    }
    return "";
}

string path = GetAndroidInternalFilesDir() + "/Android/data/com.myName.ProductName/files/SavedScreen.png"
公共静态字符串getAndroidTernalFilesDir()
{
字符串[]潜在目录=新字符串[]
{
“/storage/sdcard0”,
“/sdcard”,
“/storage/sdcard1”
};
if(Application.platform==RuntimePlatform.Android)
{
对于(int i=0;i
我没有错误。但我在手机的文件系统或电脑中都找不到保存的文件

我做错什么了吗?我对Android不太了解(甚至可能什么都不知道),所以也许我在Android如何处理文件方面遗漏了一些东西?也许这完全是不可能的,所以我也在想,你是否知道有什么方法可以让我得到现场直播(或是最后一个镜头),最好不是无线的

谢谢,请在评论中要求澄清,我真的被困在这里了


Ps:我有一个华为Mate 10 lite

即使你解决了存储问题,以60fps的速率流式传输高质量图像也不是那么简单的任务。因为你不知道android的开发,这可能是一个更大的问题

我会建议你选择一个可能对你有帮助的替代方案,并且不需要真正的android开发

Android允许使用shell捕获屏幕截图并从设备检索此屏幕截图:

adb shell screencap -p /sdcard/screenshot.png
adb pull /sdcard/screenshot.png .
因此,您可以编写简单的bash脚本来捕获摄像头应用程序的屏幕截图:

#!/usr/bin/env bash

function make-screenshot {

    name=$(date).png
    name=${name// /_}

    adb shell screencap -p /sdcard/${name}
    adb pull /sdcard/${name} .
    adb shell rm /sdcard/${name}
}

while true
do
    make-screenshot
    sleep $((1 / 60))
done
这里的问题是传输屏幕截图相对较慢,因此60fps很难实现。因此,另一种选择是录制屏幕视频并存储在设备上:

adb shell screenrecord /sdcard/screen-video.mp4

非常感谢你的回答!很抱歉我反应太晚了。你说的正是我害怕的。这可能是可以实现的,但可能不是在60帧,甚至20帧对我来说将是神奇的实现!我会研究一下bash的截图!谢谢就你最后一点的主题提出一个问题;录音是否在完成后保存,或者是否可以在录音时获取?换句话说,记录是否仅在记录完成后存储?我自己也不这么认为,但值得一试:)