-- 录制小视频:
Camera -> YUV帧序列 -> YUV帧处理(镜像,缩放,旋转) -> 编码器  -> H264数据
大体上就是从摄像头输出的YUV帧经过预处理之后,送入编码器,获得编码好的h264视频流。
上面只是针对视频流的编码,另外还需要对音频流单独录制,最后再将视频流和音频流进行合成出最终视频。

 

  IM软件就需要即时通讯技术、视频软件就需要视频编解码技术、游戏就需要引擎技术。
  查看源码的工具:sourceinsight , 不了解JNI的一定要学习下,否则只能在JAVA层搞,太狭隘了。

音视频采集–压缩编码–封装–推流–分发–流媒体协议观看.

 音视频流程:视频采集→视频预处理→视频编码与封装→数据的存储/传输→视频解封装/解码→视频后处理→视频输出。
 音视频的录制、播放、编码、上传、下载、观看等

 容器格式:常见的视频容器格式有avi、mp4、mkv、flv、rm/rmvb、mov、ts、vob、dat,音频容器格式有MP3、WAV、AAC、APE,FLAC等
 压缩格式:视频压缩格式如mpeg2、mpeg4、H264、VC1、Rm/Rmvb,常见音频压缩格式如MPA、AAC、AC3、DTS。

视频编码入门概念-
1.音视频的录制MediaRecorder;

2.播放
Android使用MediaRecorder和Camera实现视频录制及播放功能整理-
Android三种播放视频的方式:1、调用其自带的播放器;2、使用VideoView来实现;3、使用MediaPlayer

3.视频预处理
multimedia framework VitamioBundle- https://github.com/yixia/VitamioBundle
Android中可以使用MediaCodec来访问底层的媒体编解码器,可以对媒体进行编/解码。
MediaCodec可以处理的数据有以下三种类型:压缩数据、原始音频数据、原始视频数据。MediaExtractor和MediaMuxer

4.视频编码与封装
  通常来说,对于同一平台同一硬件环境,硬编硬解的速度是快于软件编解码的。而且相比软件编解码的高CPU占用率来说,硬件编解码也有很大的优势,所以在硬件支持的情况下,一般硬件编解码是我们的首选。
  在Android中,我们可以直接使用MediaRecord来进行录像,但是在很多适合MediaRecord并不能满足我们的需求,比如我们需要对录制的视频加水印或者其他处理后,所有的平台都按照同一的大小传输到服务器等
  利用AudioRecord录音,利用OpenGL渲染相机数据并做处理。然后利用MediaCodec对音频和视频分别进行编码,使用MediaMuxer将编码后的音视频进行混合保存为Mp4的编码过程。
 Android硬件编码-音视频编码以及音视频混合-
 MP4封装格式结构图:用EsEYE查看;用winhex分析

5.视频数据的存储/传输 (实时录制 实时传输)
android实时视频网络传输方案总结(一共有五套)-
Android 实时视频采集/编码/传输/解码/播放—方案调研(初)-
  文件上传,断点续传
  android 选择视频文件 上传到后台服务器-
  okhttp实现断点上传- https://github.com/handsometong/okhttpUpLoader
  有找到一个案例也是采用Socket作为上传方式(大文件上传,不适合使用POST,GET形式)。由于大文件夹不适合http上传的方式,所以就想能不能把大文件切割成n块小文件,然后上传这些小文件,所有小文件全部上传成功后再在服务器上进行拼接。这样不就可以实现断点上传,又解决了http不适合上传大文件的难题了吗!制定方案采用分块顺序上传,最后确定采用http协议来实现。
android Http分块顺序上传大视频

6.视频解封装/解码(播放器即解码器)
 解码流程:input file(Demuxer)> Encoded data packets(decoder)> decoded frames(Encoded)> Encoded data packets(muxer)> output file
 h.264视频。用android标准的API (MediaCodec)实现视频的硬件编解码。
 Android 用MediaCodec实现视频硬解码(转)-
 https://github.com/yixia/VitamioBundle

7.视频后处理
  视频美颜/滤镜
  是对音频处理还是对视频处理。音频是去噪音、去回音、混音???视频 加水印 美颜 ???还是对音视频容器层处理?

8.视频输出(视频下载)
 文件下载,断点下载
  视频流的传输,往往有两种协议,一种是HTTP,一种是RTSP。两种协议最大的不同是,HTTP协议,不支持实时流媒体的播放,而RTSP协议就支持。
 多线程、断点续传下载;下载管理:开始、暂停、继续、取消、重新开始
 okhttp,OkHttpManager类
  基于okhttp的文件下载、上传工具- https://github.com/Othershe/DUtil

 - 系统提供的下载管理器进行下载

//创建下载任务,downloadUrl就是下载链接
 DownloadManager.Request request = new DownloadManager.Request(Uri.parse(downloadUrl));
 //指定下载路径和下载文件名
 request.setDestinationInExternalPublicDir("/download/", fileName);
 //获取下载管理器
 DownloadManager downloadManager= (DownloadManager) 
 mContext.getSystemService(Context.DOWNLOAD_SERVICE);
 //将下载任务加入下载队列,否则不会进行下载
 downloadManager.enqueue(request);

文件下载:

URL url=new URL(urlStr);  
                 HttpURLConnection conn=(HttpURLConnection)url.openConnection();  
                 //取得inputStream,并进行读取  
                 InputStream input=conn.getInputStream();  
                 BufferedReader in=new BufferedReader(new InputStreamReader(input));  
                 String line=null;  
                 StringBuffer sb=new StringBuffer();  
                 while((line=in.readLine())!=null){  
                     sb.append(line);  
                 }

安卓通用Http文件下载管理器FileDownloader(https://github.com/wlfcolin/file-downloader)