【问题标题】:How to get live mobile camera feed to computer?如何将实时移动摄像头馈送到计算机?
【发布时间】:2019-12-26 15:23:46
【问题描述】:

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

现在我的问题是从两部手机获取实时信息到我的计算机,然后计算所需的一切。我现在正在做的是在两部手机上使用一个名为 IP Webcam 的应用程序,该应用程序通过内部网发送两部相机的最后一张照片。

但问题是在互联网上以每秒 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"

而且我没有收到任何错误。但是我在手机的文件系统或者电脑上都找不到保存的文件……

我做错了吗?我对 Android 不太了解(甚至可能一无所知),所以也许我在 Android 如何处理文件方面遗漏了一些东西?也许这完全是不可能的,所以我还想知道你是否知道我可以通过任何方式获得实时信息(或相机的最后一张照片),最好不是无线方式?

谢谢你,请随时在cmets中要求澄清,我真的被困在这里......

Ps:我有一个华为 Mate 10 lite

【问题讨论】:

    标签: android image file unity3d


    【解决方案1】:

    即使您解决了存储问题,以 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 fps,即使是 20 fps 对我来说也是神奇的!我将对 bash 屏幕截图进行一些研究!谢谢!关于你最后一点的主题只有一个问题;录音是在后者完成后保存还是在录音时可以得到?换句话说,录音是不是只有在录音完成后才存储?我自己不这么认为,但值得一试:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-27
    • 2016-02-23
    • 2011-11-26
    • 2011-11-18
    • 2020-01-01
    • 2012-02-20
    • 1970-01-01
    相关资源
    最近更新 更多