视频基础知识
#编码(生产部分)
所谓视频编码方式就是指通过特定的压缩技术,将某个视频格式的文件转换成另一种视频格式文件的方式。视频流传输中最为重要的编解码标准有国际电联的H.261、H.263、H.264,运动静止图像专家组的M-JPEG和国际标准化组织运动图像专家组的MPEG系列标准,此外在互联网上被广泛应用的还有Real-Networks的RealVideo、微软公司的WMV以及Apple公司的QuickTime等。
MPEG-4第二部分可以用在网络传输上。这里面MPEG-4第十部分和H.264的标准十分接近,两个编码组织甚至合作,为这个标准命名为H.264/AVC,这也是目前主流的编码格式,我们所看的很多视频都是采用H.264编码。
MPEG系列
(由ISO[国际标准组织机构]下属的MPEG[运动图象专家组]开发 )视频编码方面主要是Mpeg1(vcd用的就是它)、Mpeg2(DVD使用)、Mpeg4(的DVDRIP使用的都是它的变种,如:divx,xvid等)、Mpeg4 AVC(正热门);音频编码方面主要是MPEG Audio Layer 1/2、MPEG Audio Layer 3(大名鼎鼎的mp3)、MPEG-2 AAC 、MPEG-4 AAC等等。注意:DVD音频没有采用Mpeg的。
H.26X系列
(由ITU[国际电传视讯联盟]主导,侧重网络传输,注意:只是视频编码)
包括H.261、H.262、H.263、H.263 、H.263 、H.264(就是MPEG4 AVC-合作的结晶) [1]
图像压缩编码有多种,如JPEG、PSD、GIF等,把视频的每一帧图片压缩成JPEG格式(编码),就是Motion JPEG。用这种视频压缩格式压缩完的视频还是会很大,难以传输和存储。我们注意到,很多情况下,视频每两帧之间的画面差异并不大,所以记录两帧图片的全量数据会有很多重复数据,这样,我们就可以记录增量,从而大大减少数据存储量。H264就采用了这种存增量的思想,以高压缩高质量和支持多种网络的流媒体传输著称。H264采用的核心算法是帧内压缩和帧间压缩,帧内压缩是生成I帧的算法,帧间压缩是生成B帧和P帧的算法。I帧表示关键帧,可以理解为这一帧画面的完整保留,解码时只需要本帧数据就可以完成;P帧解码时,需要它前一帧的信息;B帧解码时需要它前一帧和后一帧的数据。
#封装格式(包装部分)
封装格式(也叫容器),就是将已经编码压缩好的视频轨和音频轨按照一定格式放到一个文件中,也就是说,仅仅是一个外壳。通俗讲:视频轨是米饭,音频轨是菜,封装格式就是一个锅或者碗。
AVI:微软在90年代初创立的封装标准,压缩标准可任意选择。
FLV:针对于h.263家族的格式,ts流媒体格式,电视。
MKV:万能封装器,有良好的兼容和跨平台性、纠错性,可带 外挂字幕。
MOV:MOV是Quicktime封装。
MP4:主要应用于mpeg4的封装 。
TS/PS:PS封装只能在HDDVD原版。
WMV:微软推出的,作为市场竞争。
#解码
解码,是编码流程的逆过程。
#重采样
Android放音的采样率固定为44.1KHz,录音的采样率固定为8KHz,因此底层的音频设备驱动需要设置好这两个固定的采样率。如果上层传过来的采样率不符的话,需要进行resample重采样处理。
几个名词:
1. 采样率
采样设备每秒抽取样本的次数
2. 音频格式及量化精度(位宽)
每种音频格式有不同的量化精度(位宽),位数越多,表示值就越精确,声音表现自然就越精准。FFMpeg中音频格式有以下几种,每种格式有其占用的字节数信息:
AV_SAMPLE_FMT_U8, ///< unsigned 8 bits
AV_SAMPLE_FMT_S16, ///< signed 16 bits
AV_SAMPLE_FMT_S32, ///< signed 32 bits
AV_SAMPLE_FMT_FLT, ///< float
AV_SAMPLE_FMT_DBL, ///< double
3. 分片(plane)和打包(packed)
以双声道为例,带P(plane)的数据格式在存储时,其左声道和右声道的数据是分开存储的,左声道的数据存储在data[0],右声道的数据存储在data[1],每个声道的所占用的字节数为linesize[0]和linesize[1];
不带P(packed)的音频数据在存储时,是按照LRLRLR...的格式交替存储在data[0]中,linesize[0]表示总的数据量。
4. 声道分布(channel_layout)
声道分布在FFmpeglibavutilchannel_layout.h中有定义,一般来说用的比较多的是AV_CH_LAYOUT_STEREO(双声道)和AV_CH_LAYOUT_SURROUND(三声道)
#像素格式
RGB是一种常见的颜色编码方法,在显示器上,是通过电子枪打在屏幕的红(Red)、绿(Green)、蓝(Blue)三色发光极上来产生色彩的; 而相机采集到的图像是使用YUV颜色编码方式,“Y”表示明亮度,“U”和“V”则是色度、浓度。我们的视频就是由相机采集到的,所以我们要处理的视频里每一帧的颜色编码格式为YUV,要显示到屏幕上到话,需要处理频里每一帧的颜色编码格式,YUV 转换为RGB。RGB存放方式:矩阵每一行做了对其操作,每行数据后会多一些数据。
YUV三种存储数据形式
大体开发阶段
1.做一个播放自定义格式视频的视频播放器。【原因:输入我们系统的视频格式是各式各样的,如mp4、mov等,我们需要将他们处理成我们自定义的视频格式,再进行视频编辑处理】
2.做视频裁剪
3.做视频改分辨率、播放速度等
环境搭建
1.安装android Studio
2.新建android项目
3.下载NDK,点击右上角的下载图标,找到SDK Tools,下载一下相关包。
需要安装的sdk tools
概念补充
参考https://blog.csdn.net/carson_ho/article/details/73250163
(1). JNI介绍
1.1简介
JNI,全称:Java Native Interface ,即java本地接口,作用:使得Java与本地其他类型语言(如c、 c )交互。
JNI是java调用Native语言的一种特性, JNI属于java,与android无直接关系
1.2实现步骤
1.在Java中声明Native方法(即需要调用的本地(c )方法)
2.编译上述Java源文件javac(得到.class文件)
3.通过javah命令导出JNI的头文件(.h文件)
4.使用java需要交互的本地代码(c ) 实现在Java中声明的Native方法
5.编译.so库文件
6.通过java命令执行java程序,最终实现java调用本地代码(c )
(2). NDK介绍
2.1简介
NDK,全称Native Development Kit,是Android的一个开发工具包,属于android,与java无直接关系。作用:快速开发C、C 的动态库,并自动将so的应用一起打包成APK,即 可以通过NDK在Android中使用JNI与本地代码(如C、C )交互
NDK允许用户使用类似C / C 之类的原生代码语言执行部分程序
提供交叉编译功能,交叉编译就是在一个平台上生成另一个平台上的可执行代码,在ndk中就是,在把电脑上(x86架构)的代码编译成手机上(arm架构)的可执行代码。
在android studio中,通过NDK从而实现JNI的功能
其他解释:
NDK是一个工具集,允许你的App使用一些底层语言代码,例如C和C 。
NDK提供一系列的工具,帮助开发者快速的开发C(或者C )动态库,并能自动将这些.so库文件和Java应用程序打包到APK中。同时NDK工具集成了交叉编译器,并提供了相应的mk文件,隔离了CPU、平台、ABI等差异,开发人员只需要简单修改mk文件(指出“哪些文件需要编译”、“编译特性要求”等),就可以创建出so库。这些将极大方便应用开发者。
(原文:https://blog.csdn.net/chewbee/article/details/51927105)
2.2实现步骤
1. 配置 Android NDK环境
2. 创建 Android 项目,并与 NDK进行关联
3. 在 Android 项目中声明所需要调用的 Native方法
4. 使用 Android需要交互的本地代码 实现在Android中声明的Native方法
eg.比如 Android 需要与 C 交互,那么就用C 实现 Java的Native方法
5. 通过 ndk - bulid 命令编译产生.so库文件
6. 编译 Android Studio 工程,从而实现 Android 调用本地代码
配置好NDK后的样子,需要根据需求修改C 文件 & Android
(3)NDK和JNI的关系
1.JNI是实现的方法,NDK是在android中实现JNI的手段。即,在android studio中,通过NDK来实现JNI功能
4.建git仓库
5.把ffmapeg编译到安卓平台上(坑较多)
作业
把ffmapeg编译到安卓平台上流程理解