Android openh264 编解码重点记录
来源:互联网 发布:windows文件夹 编辑:程序博客网 时间:2024/06/05 08:18
编译工具:CYGWIN
只要进入到openh264根目录 就能够直接根据github提供的编译步骤进行编译,之后会获得openh264相关的动态和静态库.我的openh264是15年8月下载的
下载地址
编码部分:
1 从android获取摄像头数据使用的格式是NV21(yuv420sp),由于手机拍摄默认是横屏,所以获取到数据需要将数据进行旋转(是否有更好的方式处理 之后再研究).
顺时针旋转90°,从stackoverflow上找的
private byte[] rotateYUV420Degree90(byte[] data, int imageWidth, int imageHeight) {byte[] yuv = new byte[imageWidth * imageHeight * 3 / 2];// Rotate the Y lumaint i = 0;for (int x = 0; x < imageWidth; x++) {for (int y = imageHeight - 1; y >= 0; y--) {yuv[i] = data[y * imageWidth + x];i++;}}// Rotate the U and V color componentsi = imageWidth * imageHeight * 3 / 2 - 1;for (int x = imageWidth - 1; x > 0; x = x - 2) {for (int y = 0; y < imageHeight / 2; y++) {yuv[i] = data[(imageWidth * imageHeight) + (y * imageWidth) + x];i--;yuv[i] = data[(imageWidth * imageHeight) + (y * imageWidth) + (x - 1)];i--;}}return yuv;}
注意:旋转之后的宽高在放进去编码时需要调换过来,不然等到后面解码出来会出现显示的长宽反了
public byte[] nv21ToI420(byte[] yuv420sp, int width, int height) {int framesize = width * height;byte[] yuv420 = new byte[framesize * 3 / 2];int i = 0, j = 0;// copy yfor (i = 0; i < framesize; i++) {yuv420[i] = yuv420sp[i];}i = 0;for (j = 0; j < framesize / 2; j += 2) {yuv420[i + framesize] = yuv420sp[j + framesize];yuv420[i + framesize * 5 / 4] = yuv420sp[j + 1 + framesize];i++;}return yuv420;}
这样就能编码了
解码部分
1 使用官方提供的编解码步骤,解码出来的数据重点,需要将Y、U、V三部分进行组合成一个YUV420数据
unsigned char* buf = new unsigned char[m_iWidth * m_iHeight * 3 / 2];int a = 0;for (int i = 0; i < m_iHeight; i++) {memcpy(buf + a,data[0] + i * bufInfo.UsrData.sSystemBuffer.iStride[0],m_iWidth);a += m_iWidth;}for (int i = 0; i < m_iHeight / 2; i++) {memcpy(buf + a,data[1] + i * bufInfo.UsrData.sSystemBuffer.iStride[1],m_iWidth / 2);a += m_iWidth / 2;}for (int i = 0; i < m_iHeight / 2; i++) {memcpy(buf + a,data[2] + i * bufInfo.UsrData.sSystemBuffer.iStride[1],m_iWidth / 2);a += m_iWidth / 2;}
jbyte* yuv420p = reinterpret_cast<jbyte*>(buf);jint* rgb = new jint[frameSize];int i = 0, j = 0, yp = 0;int up = 0, vp = 0, u = 0, v = 0;for (j = 0, yp = 0; j < m_iHeight; j++) {up = frameSize + (j >> 2) * m_iWidth;vp = frameSize * 5 / 4 + (j >> 2) * m_iWidth;u = 0;v = 0;for (i = 0; i < m_iWidth; i++, yp++) {int y = (0xff & ((int) yuv420p[yp]));if (y < 0)y = 0;if ((i & 1) == 0) {u = (0xff & yuv420p[up++]);v = (0xff & yuv420p[vp++]);}int y1192 = y_table[y];int r = r_yv_table[y][u];int g = (y1192 - g_v_table[u] - g_u_table[v]);int b = b_yu_table[y][v];if (g < 0)g = 0;else if (g > 262143)g = 262143;rgb[yp] = 0xff000000 | ((r << 6) & 0xff0000)| ((g >> 2) & 0xff00) | ((b >> 10) & 0xff);}}env->SetIntArrayRegion(result, 0, frameSize, rgb);delete[] rgb;这段代码由网上找来的,稍微修改,改成I420转ARGB
解码出来之后就可以到Android显示了,显示用的是opengl,代码太多就不放出来了,网上很多。
============================================================================================
2016-5-18
yuv的显示直接用opengl显示了,而不必转成rgb再去显示了
============================================================================================
2016-10-21
一段时间没时间去研究视频显示,现在要用的时候发现一个问题:前置摄像头和后置摄像头的视频排版不一样
前置摄像头和后置摄像头区别
1.preview输出的data数据:
1.preview输出的data数据:
以横屏为标准
前置摄像头是反方想的,即正上方向右,后置摄像头和视频显示出来的图像是正的 即正上方向左
2.旋转的时候就需要注意:
后置摄像头是正常旋转,前置摄像头需要左右调换再旋转
ps:记住前置摄像头是相反的
3
前置摄像头和后置摄像头区别
1.preview输出的data数据:
前置摄像头是反方想的,即正上方向右,后置摄像头和视频显示出来的图像是正的 即正上方向左
2.旋转的时候就需要注意:
后置摄像头是正常旋转,前置摄像头需要左右调换再旋转
3.yuv颜色显示:
后置摄像头正常Y-U-V 而前置摄像头是Y-V-U
1.preview输出的data数据:
前置摄像头是反方想的,即正上方向右,后置摄像头和视频显示出来的图像是正的 即正上方向左
2.旋转的时候就需要注意:
后置摄像头是正常旋转,前置摄像头需要左右调换再旋转
3.yuv颜色显示:
后置摄像头正常Y-U-V 而前置摄像头是Y-V-U
1 0
- Android openh264 编解码重点记录
- 语音编解码记录
- openH264解码流程
- android语音编解码:speex编解码
- Android 编解码
- android amr编解码
- android webp编解码
- android base64编解码
- android pcm编解码
- android pcm编解码
- Android短信编解码
- android 编解码
- android pcm编解码
- android pcm编解码
- Android G711编解码
- android pcm编解码
- android amr编解码
- android webp编解码
- 目标检测的图像特征提取之(一)HOG特征
- 深浅拷贝问题
- PAT (Advanced Level) Practise 1058 A+B in Hogwarts (20)
- Swift - 给图片添加文字水印(图片上写文字,并可设置位置和样式)
- POSIX 线程库功能接口与知识点汇总
- Android openh264 编解码重点记录
- Python解析JSON
- Longest Substring Without Repeating Characters
- VS2010 OPENGL环境配置
- 如何阅读jQuery源码整体架构
- 3.16
- 引用类型和值类型区别
- 菜鸟成长记-UITableView
- 六:java中线程范围内共享变量--ThreadLocal