上一章写了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 ,这里上一章写的很清楚了。