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

转载于:https://my.oschina.net/xiaolei123/blog/1786800

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一: 使用javacv来实现,最终也是用过ffmpeg来进行编码和推javacv实现到可以直接接收摄像头的帧数据 需要自己实现的代码只是打开摄像头,写一个SurfaceView进行预览,然后实现PreviewCallback将摄像头每一帧的数据交给javacv即可 javacv地址:https://github.com/bytedeco/javacv demo地址:https://github.com/beautifulSoup/RtmpRecoder/tree/master 二: 使用Android自带的编码工具,可实现硬编码,这里有一个国内大神开源的封装很完善的的库yasea,第一种方法需要实现的Camera采集部分也一起封装好了,进行一些简单配置就可以实现编码推,并且yasea目前已经直接支持摄像头的热切换,和各种滤镜效果 yasea地址(内置demo):https://github.com/begeekmyfriend/yasea 服务器 媒体服务器我用的是srs,项目地址:https://github.com/ossrs/srs 关于srs的编译、配置、部署、在官方wiki中已经写的很详细了,并且srs同样是国内开发人员开源的项目,有全中文的文档,看起来很方便 这里有最基本的简单编译部署过程 Android直播实现(二)srs媒体服务器部署 播放android端的播放使用vitamio,还是国内的开源播放器,是不是感觉国内的前辈们越来越屌了^~^! vitamio支持几乎所有常见的的视频格式和媒体协议 vitamio地址(内置demo):https://github.com/yixia/VitamioBundle 这里使用的是yaesa库,先介绍一下直播实现的程:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值