将第三方硬件的画面输出到TextrueView

蓝鹰 2015-08-18 09:53:34
关于使用TextureView做视频播放器,做摄像头预览,在网上已经有各种各样的帖子,这写方法的共同点无非就是重写
TextureView.SurfaceTextureListener,然后将TextureView的SurfaceTexture设置为输出目标,比如相机预览就是:
    
public void onSurfaceTextureAvailable(SurfaceTexture surface, int width,
int height) {
// mCamera = Camera.open();
try {
mCamera.setPreviewTexture(surface);
mCamera.startPreview();
} catch (IOException ioe) {
// Something bad happened
}
}

可是现在我有一个第三方的硬件设备,通过USB接入,这个设备的SDK里面根本不可能有surface或者SurfaceTexture之类的概念,设备输出的是连续的一帧一帧的图像数据,我该如何利用TextureView来显示他们?
...全文
197 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
sky-Z 2015-08-18
  • 打赏
  • 举报
回复
引用 12 楼 蓝鹰的回复:
[quote=引用 11 楼 YKDSea 的回复:] [quote=引用 10 楼 blackeagleX 的回复:] [quote=引用 8 楼 YKDSea 的回复:] [quote=引用 6 楼 blackeagleX 的回复:] [quote=引用 5 楼 YKDSea 的回复:] 你要做的实际就是类似camera hal的动作,只是要在你贴的代码的更下层去处理,可以在natvie处理,将texture view的buffer传到native,通过nativewindow的接口可以直接dequeue到对应的buffer,将硬件传回的数据copy到这个buffer在queue回去就可以了。。
你好,谢谢,我去看看camera hal的源码,另外,你说的nativewindow的实例是和textureView对应的那个吗?[/quote] nativewindow可以看作和surface是一样的,可以看下我blog里面的相关类的简单说明:http://blog.csdn.net/ykdsea/article/details/39934075[/quote] 重写GLSurfaceView的Renderer似乎比这样做更容易[/quote] GLSurfaceView在性能上来说比用TextureView要好一些(少了一次copy数据的动作)。我觉得你可以先这么做,要做后期效果的话GLSurfaceView是跑不掉的,即使后面需要用TextureView来得到传感器数据,改动也不会太大,现在写代码的时候,可以加一些接口以防后面有这种需求。[/quote] 谢谢你的回答帮了我大忙了[/quote] 不客气,互相学习~
蓝鹰 2015-08-18
  • 打赏
  • 举报
回复
引用 11 楼 YKDSea 的回复:
[quote=引用 10 楼 blackeagleX 的回复:] [quote=引用 8 楼 YKDSea 的回复:] [quote=引用 6 楼 blackeagleX 的回复:] [quote=引用 5 楼 YKDSea 的回复:] 你要做的实际就是类似camera hal的动作,只是要在你贴的代码的更下层去处理,可以在natvie处理,将texture view的buffer传到native,通过nativewindow的接口可以直接dequeue到对应的buffer,将硬件传回的数据copy到这个buffer在queue回去就可以了。。
你好,谢谢,我去看看camera hal的源码,另外,你说的nativewindow的实例是和textureView对应的那个吗?[/quote] nativewindow可以看作和surface是一样的,可以看下我blog里面的相关类的简单说明:http://blog.csdn.net/ykdsea/article/details/39934075[/quote] 重写GLSurfaceView的Renderer似乎比这样做更容易[/quote] GLSurfaceView在性能上来说比用TextureView要好一些(少了一次copy数据的动作)。我觉得你可以先这么做,要做后期效果的话GLSurfaceView是跑不掉的,即使后面需要用TextureView来得到传感器数据,改动也不会太大,现在写代码的时候,可以加一些接口以防后面有这种需求。[/quote] 谢谢你的回答帮了我大忙了
sky-Z 2015-08-18
  • 打赏
  • 举报
回复
引用 10 楼 blackeagleX 的回复:
[quote=引用 8 楼 YKDSea 的回复:] [quote=引用 6 楼 blackeagleX 的回复:] [quote=引用 5 楼 YKDSea 的回复:] 你要做的实际就是类似camera hal的动作,只是要在你贴的代码的更下层去处理,可以在natvie处理,将texture view的buffer传到native,通过nativewindow的接口可以直接dequeue到对应的buffer,将硬件传回的数据copy到这个buffer在queue回去就可以了。。
你好,谢谢,我去看看camera hal的源码,另外,你说的nativewindow的实例是和textureView对应的那个吗?[/quote] nativewindow可以看作和surface是一样的,可以看下我blog里面的相关类的简单说明:http://blog.csdn.net/ykdsea/article/details/39934075[/quote] 重写GLSurfaceView的Renderer似乎比这样做更容易[/quote] GLSurfaceView在性能上来说比用TextureView要好一些(少了一次copy数据的动作)。我觉得你可以先这么做,要做后期效果的话GLSurfaceView是跑不掉的,即使后面需要用TextureView来得到传感器数据,改动也不会太大,现在写代码的时候,可以加一些接口以防后面有这种需求。
蓝鹰 2015-08-18
  • 打赏
  • 举报
回复
引用 8 楼 YKDSea 的回复:
[quote=引用 6 楼 blackeagleX 的回复:] [quote=引用 5 楼 YKDSea 的回复:] 你要做的实际就是类似camera hal的动作,只是要在你贴的代码的更下层去处理,可以在natvie处理,将texture view的buffer传到native,通过nativewindow的接口可以直接dequeue到对应的buffer,将硬件传回的数据copy到这个buffer在queue回去就可以了。。
你好,谢谢,我去看看camera hal的源码,另外,你说的nativewindow的实例是和textureView对应的那个吗?[/quote] nativewindow可以看作和surface是一样的,可以看下我blog里面的相关类的简单说明:http://blog.csdn.net/ykdsea/article/details/39934075[/quote] 重写GLSurfaceView的Renderer似乎比这样做更容易
蓝鹰 2015-08-18
  • 打赏
  • 举报
回复
引用 8 楼 YKDSea 的回复:
[quote=引用 6 楼 blackeagleX 的回复:] [quote=引用 5 楼 YKDSea 的回复:] 你要做的实际就是类似camera hal的动作,只是要在你贴的代码的更下层去处理,可以在natvie处理,将texture view的buffer传到native,通过nativewindow的接口可以直接dequeue到对应的buffer,将硬件传回的数据copy到这个buffer在queue回去就可以了。。
你好,谢谢,我去看看camera hal的源码,另外,你说的nativewindow的实例是和textureView对应的那个吗?[/quote] nativewindow可以看作和surface是一样的,可以看下我blog里面的相关类的简单说明:http://blog.csdn.net/ykdsea/article/details/39934075[/quote] 这样看来以这样的思路来设计工作量可能比较大,或许我应该改用GLSurfaceView,因为后期在显示摄像头以及第三方传感器预览场景的同时,还需要添加3D效果。
sky-Z 2015-08-18
  • 打赏
  • 举报
回复
引用 6 楼 blackeagleX 的回复:
[quote=引用 5 楼 YKDSea 的回复:] 你要做的实际就是类似camera hal的动作,只是要在你贴的代码的更下层去处理,可以在natvie处理,将texture view的buffer传到native,通过nativewindow的接口可以直接dequeue到对应的buffer,将硬件传回的数据copy到这个buffer在queue回去就可以了。。
你好,谢谢,我去看看camera hal的源码,另外,你说的nativewindow的实例是和textureView对应的那个吗?[/quote] nativewindow可以看作和surface是一样的,可以看下我blog里面的相关类的简单说明:http://blog.csdn.net/ykdsea/article/details/39934075
sky-Z 2015-08-18
  • 打赏
  • 举报
回复
引用 6 楼 blackeagleX 的回复:
[quote=引用 5 楼 YKDSea 的回复:] 你要做的实际就是类似camera hal的动作,只是要在你贴的代码的更下层去处理,可以在natvie处理,将texture view的buffer传到native,通过nativewindow的接口可以直接dequeue到对应的buffer,将硬件传回的数据copy到这个buffer在queue回去就可以了。。
你好,谢谢,我去看看camera hal的源码,另外,你说的nativewindow的实例是和textureView对应的那个吗?[/quote] nativewindow可以看作和surface是一样的,可以看下我blog里面的相关类的简单说明:http://blog.csdn.net/ykdsea/article/details/39934075
蓝鹰 2015-08-18
  • 打赏
  • 举报
回复
引用 5 楼 YKDSea 的回复:
你要做的实际就是类似camera hal的动作,只是要在你贴的代码的更下层去处理,可以在natvie处理,将texture view的buffer传到native,通过nativewindow的接口可以直接dequeue到对应的buffer,将硬件传回的数据copy到这个buffer在queue回去就可以了。。
你好,谢谢,我去看看camera hal的源码,另外,你说的nativewindow的实例是和textureView对应的那个吗?
sky-Z 2015-08-18
  • 打赏
  • 举报
回复
你要做的实际就是类似camera hal的动作,只是要在你贴的代码的更下层去处理,可以在natvie处理,将texture view的buffer传到native,通过nativewindow的接口可以直接dequeue到对应的buffer,将硬件传回的数据copy到这个buffer在queue回去就可以了。。
蓝鹰 2015-08-18
  • 打赏
  • 举报
回复
楼上摘录自android源码,除了模仿android camera的实现,我是否有别的更简单的选择?
蓝鹰 2015-08-18
  • 打赏
  • 举报
回复
这是Camera.setPreviewTexture的实现

static void android_hardware_Camera_setPreviewTexture(JNIEnv *env,
        jobject thiz, jobject jSurfaceTexture)
{
    ALOGV("setPreviewTexture");
    sp<Camera> camera = get_native_camera(env, thiz, NULL);
    if (camera == 0) return;

    sp<IGraphicBufferProducer> producer = NULL;
    if (jSurfaceTexture != NULL) {
        producer = SurfaceTexture_getProducer(env, jSurfaceTexture);
        if (producer == NULL) {
            jniThrowException(env, "java/lang/IllegalArgumentException",
                    "SurfaceTexture already released in setPreviewTexture");
            return;
        }

    }

    if (camera->setPreviewTarget(producer) != NO_ERROR) {
        jniThrowException(env, "java/io/IOException",
                "setPreviewTexture failed");
    }
}
蓝鹰 2015-08-18
  • 打赏
  • 举报
回复
这是Camera.setPreviewTexture的实现

static void android_hardware_Camera_setPreviewTexture(JNIEnv *env,
        jobject thiz, jobject jSurfaceTexture)
{
    ALOGV("setPreviewTexture");
    sp<Camera> camera = get_native_camera(env, thiz, NULL);
    if (camera == 0) return;

    sp<IGraphicBufferProducer> producer = NULL;
    if (jSurfaceTexture != NULL) {
        producer = SurfaceTexture_getProducer(env, jSurfaceTexture);
        if (producer == NULL) {
            jniThrowException(env, "java/lang/IllegalArgumentException",
                    "SurfaceTexture already released in setPreviewTexture");
            return;
        }

    }

    if (camera->setPreviewTarget(producer) != NO_ERROR) {
        jniThrowException(env, "java/io/IOException",
                "setPreviewTexture failed");
    }
}
为了避免大家浪费时间,直接先看下面的 Gif,略大,请耐心点。看完后,若你觉得会需要到,那么就请听我继续。gif 链接 http://123.57.244.105:8081/commentthumb/GIF.gifgit显示,略大,请耐心GitHub 链接废话一句:这个显示只是其中一部分,重点是:FFmpeg Camera 的录制部分,所以,你的星星(star)也是一种更新通知 (我通知你)。https://github.com/af913337456/WeChatVideoView功能点如果你看完上面的gif图,你会发现如下几点功能 (Function list):1,直观的播放前,可以显示封面缩略图播放时,如果还没有本地缓存,那么先进行下载下载过程中,显示圆型区域进度效果下载后,播放完毕后可以循环播放播放已经播放过的,是具备本地缓存的,也就是既能播放网络,也能播放本地2,隐藏的低耗电量低内存占用无延迟图与视频切换低耦合,高内聚,几行代码接入,一共3个类解析直观的功能点,几乎就是和新版微信的一样,从朋友圈点击一个视频,然后进入到一个 Activity 页面进行加载以及播放。为什么低耗电量和低内存占用?因为采用的是 SurfaceView 而不是 TextureView,图与视频切换的切换延迟也是这个原因。在你的 Activity 中这样使用这样就会以 id 为 activity_main 的 Relativelayout 为父容器装载。因为要避免内存泄露,所以你还需要做完下面的一些步骤,不会超过6行代码。技术点 (可以不看)1,下载操作:自定义 AsyncTask。PS:AsyncTask 比 Thread handler 重量级却方便(回调进度),但是,如果是 即放即用,结束即销毁,那么,no need to think about this;2,视频播放组合拳: surfaceView mediaPlayersurfaceView 用作显示,mediaPlayer 用来解码两者关系: mediaPlayer 绑定 surfaceView。为什么不用 TextrueView?3,进度区域自定义 View,3个画笔绘制,一个圆,一个边,一个扇区。作者:林冠宏 / 指尖下的幽灵掘金:https://juejin.im/user/587f0dfe128fe100570ce2d8博客:http://www.cnblogs.com/linguanh/GitHub : https://github.com/af913337456/

80,351

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧