这个日志拖了很久了,是我的毕业设计中碰到的一个需求。
首先视频硬编码MediaRecorder类并不适合做实时发送(不知道为什么博主的机器测试出来的mdat后面紧接着并不是网上所说的一个Int表示的场长度,而是连续8个3F预留字节位,努力很久后彻底放弃了MediaRecorder,改为实现Camera的onPreviewFrame方法)
Camera的onPreviewFrame会在每一帧取回一个字节数组,格式为YUV422(ImageFormat.NV21)
这种无压缩的图片格式是相当占用空间的(480x320分辨率可以达到200KB每张图的体积,10FPS的话就有2MB每秒的传输速率,如果要网络发送的话压力是非常大的),因此需要压缩。
在网上找到的方法基本是Yuv到RGB的方式,把Yuv的数据通过数学运算得到每个像素点的RGB编码,存入Bitmap对象,再调用Bitmap对象自带的压缩方法压为jpg图片。这种方法效率极低,一张480x320分辨率的图片有20万个字节,因此运算需要经过20万次循环,在博主的小米1上测试的结果是一张图需要400毫秒的处理时间,帧速被强行降低到了2.5FPS(onPreviewFrame在执行完成之前得到的数据会自动丢弃),单张图片还好说,如果是连续图片构成的视频流是不可能完成这种需求的。
在我一筹莫展之际发现了android.graphics包下面已经存在一个YuvImage类,可以将数据直接导入:
YuvImage image = new YuvImage(data,ImageFormat.NV21,IMG_WIDTH,IMG_HEIGHT,null);
这个构造方法有5个参数,第一个就是字节数组,第二个是格式信息,和相机配置的时候设置的previewFormat一致即可。第三、第四个不需要解释,就是图片的长宽信息(YUV格式没有储存图片的尺寸信息,最后一个博主也不知道是什么,总之给个null就可以了)。
然后很碰巧的是YuvImage有一个compressToJPEG()方法。
需要传入的参数有3个:一个Rect对象,包含图片的显示范围,一般是(0,0)到(width,height),也可以利用这个参数对图片进行切割;
第二个是质量因数,1-100内的整数;
第三个是一个OutputStream对象,会把结果输出到这个Stream。
实际测试80质量的480x320尺寸图片压缩只用了50ms,效率大大提高。
不过这种jpg图片似乎和传统jpg编码格式有差异,打开是可以正常打开的,而用FFMpeg压缩的时候显示是jpg-yuv的格式,也就是说直接将yuv以jpg格式压缩的。如果需要进一步转换可能依然需要转为RGB格式。
分享到:
相关推荐
yuv格式转换成jpg格式的一个小程序 对于格式转换的初学有很大帮助
此软件主要将YUV420视频流转码成单帧jpg图片,运行环境为LINUX。所有需要用到的库都以静态库方式存在于lib路径下。具体编译和使用参见readme.txt
python批量转换yuv图像到jpg图像 循环遍历指定的目录,查找后缀为.yuv的文件。根据文件名解析出图像宽高。 利用numpy和opencv转换为jpg图像并保存。 注意:本脚本读取的是灰度图,设置uv分量为固定值0x80.
绝对好用的YUV422转jpeg程序,调用jpeg库
c++视频解析 yuv转jpg
YUV 图像格式详解是欧洲电视系统所采用的颜色编码方法,属于 PAL 和 SECAM 模拟彩色电视制式采用的颜色空间。YUV 图像格式的主要特点是将图像信号分解为亮度信号 Y 和两个色差信号 U、V,实现了亮度和色度的分离。 ...
jpg转yuv420/yuv444 ,包括jpg头解析、Huffman解码 、IDCT等。纯C语言实现无任何第三方库。使用方法:代码编译后运行 ./main ./3.jpg ./4.yuv 444 第一个参数是输入jpg路径,第二个参数是输出yuv路径,第三个参数是...
Android 使用libyuv对Android yuv数据进行缩放,旋转,镜像,裁剪等操作
一个YUV图像垂直和水平拼接的程序,包含源码、Makefile和测试yuv文件。 适用于 yuv420 sp 图像的拼接,稍微修改可以适配更多格式
自己写的YUV420转换成jpg的源码,可以直接将YUV420的数据转换成JPG格式
整理了yuv格式转bmp格式源码,yuv格式转jpg格式源码。
c语言实现的yuv裸图转jpeg压缩源码
纯cpp实现 yuv 422p 和 yuv 420p 相互转换
改用原始图像数据流回调函数RegisterImageStreamCallback进行抓图 但回调函数帧为YUV420格式 需要转成Bitmap才用用于显示及本地查看 在网上找了好多都是基于R Y+1 4075 V 128 G Y 0 3455 U 128 – 0 7169 V 128 B Y+...
这是一个从YUV转到JPG的源程序 包括源程序和一些库函数和文件头。
将yuv图像转为.jpg文件 python代码+素材
windows平台下很好用的yuv图像查看工具,也可以将yuv图像转换为其他图像格式,图像处理中可以用到
我在用鱼眼摄像头拍照后想要预览或者处理时遇到了困难:因为摄像头拍照后的格式是YUV格式的(具体而言YUYV或YUV422)无法预览,网上虽然下到了能读的工具,但是无法保存。本工具提供了批量读入和批量转换的功能,...
显示YUV图像,绝对可用,将YUV转换为RGB格式显示
源码通过ffmpeg库实现将jpeg图像转换为yuv420,yuv422,yuv444,rgb24等格式数据