Android视频直播流(三) YUV 数据的存储,以及播放

上一章写了YUV数据的获取,这里写写怎么把YUV数据保存起来,以及播放吧。

因为YUV数据,都是从camera的回调里拿到的,所以不可以对回调进行阻塞,所以最好的处理方式就是:

定义一个队列,在camera的回调里只管往队列里塞数据,在外部,用一个线程,死循环,利用队列的特性:有数据拿取数据,并且移除,没数据则阻塞等待。这个特性在子线程中对数据进行耗时处理。

代码是这样的:


val queue = LinkedBlockingQueue<ByteArray>()
thread {
    val file = File(cacheDir, "xiaolei.yuv")
    if (!file.exists())
    {
        file.createNewFile()
    }
    val fos = file.outputStream()
    var num = 0
    while (loop) // 子线程中死循环
    {
        val array = queue.take() // 拿数据
        fos.write(array) // 往本地文件写入
        fos.flush() // 刷新
    }
}

camera_view.onPreviewCallback { bytes, _ -> // 摄像头数据的回调
    queue.put(bytes) // 往队列里面添加数据
}

数据取完之后,就要播放了,这里推荐一个YUV文件的播放神器:

https://gitee.com/xcode_xiao/TestCamera/tree/master/app/src/main/assets

这里使用需要注意一下,这里需要选择对应的宽高,就是Camera里设置的分辨率的宽高,以及是 NV21 还是 YV12 或者 NV12 ,这里上一章写的很清楚了。

猜你喜欢

转载自my.oschina.net/xiaolei123/blog/1786800