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

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

C
ChaseTW
能够生存下来的物种,并不是那些最强壮的,也不是那些最聪明的,而是那些对变化做出快速反应的。
6
发布数
3
关注者
3397
累计阅读

热门教程文档

Swift
54小节
Vue
25小节
C++
73小节
Typescript
31小节
Lua
21小节
广告