视频和语音播放(进行中)

点播,直播,VR(录制音频和视频,在线的和本地的),视频播放器和音乐播放器(播放音乐和视频),视频和语音

VideoView并不是支持播放所有格式的视频,它仅支持mp4和3gp格式的文件,实际上它的本质是SurfaceView+MediaPlayer的封装。而SurfaceView一般是用于游戏,它不适用的原因有两个,一是它支持视频播放的格式有限,二是在播放视频的时候消耗的系统内存比较大。


思路:(视频采集/编码/传输/解码/播放)
1.先写视频音频的播放,然后侧边功能 图片加水印和截屏(图片滤镜 美化???);

2.录制音频和视频 
3.压缩音频视频上传,编码音视频
4.下载视频 解码音视频 播放等。


Android 音频系统:从 AudioTrack 到 AudioFlinger- http://blog.csdn.net/zyuanyun/article/details/60890534
Linux ALSA 音频系统- http://blog.csdn.net/zyuanyun?viewmode=contents

支持(Android原生, iOS原生 ,手机移动段端的H5 / iPad h5,PC H5)

opengl ES,OpenCV,openCL。

视频滤镜、音频滤镜.

了解音视频编解码的传输协议,编解码方式,以及如何技术选型。在很多领域(教育,游戏,娱乐,体育,跑步,餐饮,音乐等)尝试做音视频直播/点播功能。

多媒体文件格式- http://www.cnblogs.com/batsing/p/5132186.html
视频格式:mp4 m4v 3gp mpg/mpeg,flv f4v swf,avi gif wmv rmvb mov ,mts m2t,webm ogg mkv rm ASF RM/RA/RAM DIVX ,QuickTime ,REAL VIDEO
音频格式:MP3, aac m4a,ape flac, wav, wma, amr, mid,CD(.cda) WAVE(.WAV) .MP1/.MP2/.MP3 .MP4 MIDI(.MID) PCM ogg mpc mp3pro RA APE AIFF AU RealAudio VQF 
图片-点阵图:jpg,png gif bmp ico tif(tiff) psd/psb webP RAW pdf DCM sai/rif
图片-矢量图:eps/ai/cdr  svg ttf
图片格式: BMP PCX TIFF GIF JPEG TGA EXIF FPX SVG PSD CDR PCD DXF UFO EPS PNG

1080P:是1920X1080; 2K是:2160X1440; 4K是:3840X2160
Android给图片加文字和图片水印- http://blog.csdn.net/dawanganban/article/details/51148070
将当前屏幕保存为图片文件的类(简单说就是抓屏)- http://blog.csdn.net/arui319/article/details/9273563
android给视频加水印的高效方案?mediacodec硬解码,+gpuimage添加滤镜效果,再编码复用.
ffmpeg 代码实现视频添加水印功能- http://blog.csdn.net/kingdam578/article/details/40747617


> 主流的视频格式和音频格式 Android
  Android支持的视频格式
1.Android端支持mp4/3gp/mov这三种视频格式,其中最常用的是前两个; 
2.视频中分视频流和音频流,Android支持的在线视频中的视频流的编码格式主流的是H.264; 
3.使用H.264作为视频中视频流的编码格式的mp4,3gp,mov视频文件都可以进行播放;如果原始的视频文件不符合要求,可以使用一个H.264转码器进行转码(eg.FreemakeVideoConverterFull.exe)。
  H.264
H.264/MPEG-4第10部分(MPEG-4第10部分也称为AVC,即Advanced Video Coding,高级视频编码),是目前使用最多的网络视频编码格式;VP8常常和网页浏览器相关联。 
Codec是什么?在数字视频领域,用的名称叫“多媒体数字信号编码解码器”. 它指的是以一种视频传输中的标准的编码解码方法. 
Container format,是一种承载视频的格式,如名字所理解的,它可能像一种容器格式. 比如,像我们所使用的avi,mpg,mov等等.
  android 原生支持的音频格式- http://blog.csdn.net/cherry609195946/article/details/25374251
AAC,MP3,AMR,ogg,PCM


> android多媒体开发 音频格式比较- http://blog.csdn.net/love_xsq/article/details/51254777
音乐爱好者常见的音频格式有:flac、ape、wav、mp3、aac、ogg、wma
1.压缩比比较:
aac>ogg>mp3(wma)>ape>flac>wav(同一音源条件下)
mp3和wma以192kbps为分界线,192kbps以上mp3好,192kbps以下wma好。
2.音质比较:
wav=flac=ape>aac>ogg>mp3>wma

酷我音乐有:无损/超品/高品/流畅音质
优酷的视频:超清/高清/标清/省流/自动

--------------------------------------------------------------------------

Image和Speech,图像 语音识别

> MediaPlayer与SoundPool:

MediaPlayer.OnPreparedListener,mediaPlayer.OnCompletion,MediaPlayer.OnInfoListener, MediaPlayer.OnErrorListener

  MediaPlayer:此类适合播放较大文件,此类文件应该存储在SD卡上,而不是在资源文件里,还有此类每次只能播放一个音频文件。
  SoundPool:此类特点就是低延迟播放,适合播放实时音实现同时播放多个声音,如游戏中炸弹的爆炸音等小资源文件,此类音频比较适合放到资源文件夹 res/raw下和程序一起打成APK文件。

  SoundPool在API 21(Android 5.0)之后就过时了,用SoundPool.Builder
Android用SoundPool播放音效- http://blog.csdn.net/wu_wxc/article/details/50318025
Android中SoundPool播放音乐- http://blog.sina.com.cn/s/blog_b4b514dd0101ckxx.html
android SoundPool播放简短音乐文件- http://blog.csdn.net/yearafteryear/article/details/8956617
  遗憾的是SoundPool目前存在的问题还比较多,我们需要谨慎使用,尽量避免程序在调用SoundPool过程中出现异常关闭的情况。
1.SoundPool最大只能申请1M的内存空间,这就意味着我们只能使用一些很短的声音片段,而不是用它来播放歌曲或者游戏背景音乐(背景音乐可以考虑使用JetPlayer来播放)。
2.SoundPool提供了pause和stop方法,但这些方法建议最好不要轻易使用,因为有些时候它们可能会使你的程序莫名其妙的终止。还有些朋友反映它们不会立即中止播放声音,而是把缓冲区里的数据播放完才会停下来,也许会多播放一秒钟。 
3.音频格式建议使用OGG格式。在我的小游戏Agile Buddy中,我一开始使用WAV格式的音频文件存放游戏音效。经过反复测试,在音效播放间隔较短的情况下会出现异常关闭的情况(有说法是SoundPool目前只对16bit的WAV文件有较好的支持)。后来将文件转成OGG格式,问题得到了解决。 

> MediaRecorder和AudioRecorder:
  android语音录制可以通过MediaRecorder和AudioRecorder。
  MediaRecorder本来是多媒体录制控件,可以同时录制视频和语音,当不指定视频源时就只录制语音;AudioRecorder只能录制语音。
二者录制的区别在于,MediaRecorder固定了语音的编码格式,具体平台支持类型可以在http://developer.android.com/guide/appendix/media-formats.html这里查看,而且使用时指定输出文件,在录制的同时系统将语音数据写入文件。AudioRecorder输出的是pcm,即原始音频数据,使用者需要自己读取这些数据,这样的好处是可以根据需要边录制边对音频数据处理,读取的同时也可以保存到文件进行存储。
  语音的播放可以使用MediaPlayer和AudioTracker,与上面的对应,MediaPlayer可以播放各种多媒体文件,而AudioTracker只能播放pcm数据,使用者手动将数据连续写入进行播放。

Android使用VideoView播放网络视频- http://blog.csdn.net/kepoon/article/details/6772060
Android支持播放网络上的视频。在播放网络上的视频时,牵涉到视频流的传输,往往有两种协议,一种是HTTP,一种是RTSP。这
两种协议最大的不同是,HTTP协议,不支持实时流媒体的播放,而RTSP协议就支持。
Android中自带的播放器,以及 VideoView等都支持上述两种协议,因此,可以直接播放网络上的视频,唯一不同的就是URI

----------------------------------------------------------

> MP3音乐播放器

玩转Android之在线视频播放控件Vitamio的使用- http://blog.csdn.net/u012702547/article/details/51317709
Android应用开发--MP3音乐播放器代码实现(一)- http://blog.csdn.net/wwj_748/article/details/8902071/
Android实现简单音乐播放器(MediaPlayer)- http://www.cnblogs.com/wsine/p/5177372.html
Android做的视频播放器MediaPlayer

Android在Service里播放与控制音乐- http://download.csdn.net/detail/feifei454498130/5740835


扫描手机内存和SD卡,并可以做分页查找
// 扫描本地音乐文件并放入List的代码如下:
public List getListByLocal() {
Cursor cursor = getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null, null,MediaStore.Audio.Media.DEFAULT_SORT_ORDER);
List localMp3s = new ArrayList();
for (int i = 0; i < cursor.getCount(); i++) {
cursor.moveToPosition(i);
LocalMp3 localMp3 = new LocalMp3();
cursor.moveToNext();
String title = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.TITLE));
String artist = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST));
long duration = cursor.getLong(cursor.getColumnIndex(MediaStore.Audio.Media.DURATION));
String mp3url = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DATA));
int isMusic = cursor.getInt(cursor.getColumnIndex(MediaStore.Audio.Media.IS_MUSIC)); // 判断是否音乐
if (isMusic != 0) {
localMp3.setTitle(title);
localMp3.setArtist(artist);
localMp3.setDuration(duration);
localMp3.setMp3url(mp3url);
localMp3s.add(localMp3);
}
}
cursor.close();
return localMp3s;
}

Android开发本地及网络Mp3音乐播放器- http://www.2cto.com/kf/201605/504920.html
android 扫描手机内存和SD卡,获取手机的视频、音频文件- http://blog.csdn.net/cwg19910909/article/details/50268443
Android读取SD卡中的媒体文件(MP3)- http://blog.csdn.net/qq_20538515/article/details/49048439
安卓Android获取SD卡上所有的音乐文件信息- http://www.lc365.net/blog/b/32115/

android 播放器解析MP3歌名和作曲人乱码???
歌曲名、艺术家名显示乱码- http://blog.csdn.net/summerxzg/article/details/8451124
Android音乐播放器读取歌词.lrc文件乱码问题解决方法- http://blog.csdn.net/hr1992323/article/details/52799597
Android 音乐乱码问题修改- http://blog.csdn.net/tfslovexizi/article/details/42583955
android mp3乱码- http://www.cnblogs.com/tanqiantot/archive/2012/08/24/3126869.html
Android音乐播放器乱码- http://blog.csdn.net/ydbcsdn/article/details/50512162

Car car=new Car();  
//解决中文乱码问题  
byte[] val = cursor.getBlob(cursor.getColumnIndex("company_name"));  
car.setCompany_name(new String(val,"GBK"));//设置编码方式 


MediaProvider和MediaScanner?MediaScanner扫出来的ID3 MP3文件演唱者名称乱码??
Android MediaScanner 多媒体扫描流程- http://blog.csdn.net/air798/article/details/51417752
Android media媒体库分析之:MediaProvider- http://www.cnblogs.com/senior-engineer/p/5115272.html
Android开发——MediaProvider源码分析- http://www.cnblogs.com/halzhang/archive/2011/03/07/1976178.html
音乐播放器乱码- http://blog.csdn.net/yangguannan/article/details/23761427
Android Media 播放mp3时ID3 tag 显示乱码的探究分析- http://www.linuxidc.com/Linux/2011-02/32259.htm
Android MediaScanner 详尽分析- http://blog.csdn.net/innost/article/details/6083467
android如何获得mp3音乐的本地专辑图片- https://github.com/mpatric/mp3agic
JNI(MediaScanner)的读书笔记- http://blog.csdn.net/wi__wi/article/details/51096475
android --- 深入理解 JNI- http://blog.csdn.net/andyhuabing/article/details/7240713/
从MediaScanner分析Android中的JNI- http://blog.csdn.net/dawanganban/article/details/42609749

我们从Windows的中文操作系统下,下载下来mp3,Tag正常显示,推进Android机后,却出现乱码,这是为什么呢?
之所以在中文系统中没有特别的问题,是因为通常电脑生成的MP3简体中文ID3标签是ID3V2.3版本,编码是ANSI,GB2312/GBK从双字节上兼容ANSI标准。而在UTF-8/Unicode为标准的系统中如Linux(Ubuntu),Android中就容易出现这种问题。

> 录制音频
录制视频的实现   Android
录制音频:调用系统的录音器,MediaRecorder,AudioRecord录制
Android录制音频的三种方式- http://m.blog.csdn.net/article/details?id=51074218  http://download.csdn.net/detail/u012808234/9482926
Android 使用AudioRecord录音相关和音频文件的封装- http://blog.csdn.net/peijiangping1989/article/details/7042610
通过Android录音进行简单音频分析- http://www.cnblogs.com/tt2015-sz/p/5616534.html

----------------------------------------------------------

推流端RTMP协议推流,视频流H264 音频流AAC,; 播放端 RTMP, FLV Http,HLS
H264、H265,2K、4K及其他转码格式;RTMP流--》HLS格式--》m3u8实时播放

> 安卓手机屏幕录像
使用Mediacodec编码,MediaMuxer封装转为MP4等格式来进行录屏.自定义view利用bitmap获取view的形式获取当前屏幕.droid 5.0时候开放了一个新的接口---android.media.projection.
http://download.csdn.net/detail/bit_kaki/9676574

Android Lollipop (5.0) 屏幕录制实现- http://www.jianshu.com/p/e9a9771eb7b8
  从 Android 4.4 Google 引入了通过 adb 命令录屏的功能,需要通过 USB 调试连接到 PC,运行 adb shell screenrecord /sdcard/xxxx.mp4开始录屏,并且录屏限制时长最长 3 分钟。Android 5.0 引入 MediaProject,可以不需要 adb,也不用 root 就可以录屏,但需要弹权限获取窗口,需要用户允许才行,这里主要介绍 Android 5.0+ 利用 MediaProject 在非 root 情况下实现屏幕录制。
Android实现录屏直播(一)ScreenRecorder的简单分析- http://blog.csdn.net/zxccxzzxz/article/details/54150396

Android 实时视频采集/编码/传输/解码/播放—方案调研(初)-http://www.cnblogs.com/skyseraph/archive/2012/03/23/2415018.html 
常见的基于H264的开源Encoder有JM、X264、T264、Hdot264等 
利用FFmpeg玩转Android视频录制与压缩(一)- http://blog.csdn.net/mabeijianxi/article/details/63335722
对最近Android项目中的视频编解码的总结- http://blog.csdn.net/feifeiwendao/article/details/52527824

----------------------------------------------------------

> 视频播放器
开源的Android视频播放器- http://blog.csdn.net/column/details/myvideo.html

Android本地视频播放器开发--简易播放器原型- http://blog.csdn.net/jwzhangjie/article/details/9127801

> 使用MediaRecorder Camera和SurfaceView录制视频,,录制短视频并播放视频:
  安卓手机实现录像的功能无非就两种方式,1.第一是实用系统自带的照相机/摄像机进行录制,然后通过回调的方式将源返回;
2.安卓自带的MediaRecorder来录制视频,并制定视频保存路径,并且可以通过Camera来播放录制的视频
 Android使用MediaRecorder和Camera实现视频录制及播放功能整理- http://blog.csdn.net/woshizisezise/article/details/51878566

---------------------------------------------------------
> VR视频播放器

制作VR视频播放器 (Google VR for Android)- http://www.jianshu.com/p/82163453ed30 http://blog.csdn.net/qq_24889075/article/details/52133170

> Google VR for Android
进入Google VR主页,发现官方给我们提供了两套解决观看VR视频的方式:Daydream;Cardboard;给我们提供了三个平台的API,分别是:Unity 3D 、Android、IOS;
  Daydream is a much higher end VR experience. I have Cardboard, and it's neat, but in some ways, it feels like a tech demo. (白日梦是一个更高的终端虚拟现实体验。纸板,它很简洁,但在某些方面,感觉技术演示。)
  那么就此看来,应该是这样的情况:Cardboard是Google先推出的简陋版/测试版/经济适用版,现在占用了很大市场;Daydream 是今年新推出的豪华版/完善版/高端玩家版,会冲击Cardboard的市场。也就是说Cardboard短期不会死 ,Daydream还在发展中。

 gvr-android-sdk- https://github.com/googlevr/gvr-android-sdk
1,libraries
2,ndk-beta
3,samples
 samples目录中有四个Demo,分别是:
1,SDK-controllerclient(Daydream的控制端)
2,SDK-simplepanowidget(全景图)
3,SDK-simplevideowidget(全景视频 也就是VR视频)
4,SDK-treasurehunt(寻宝项目)这个是我们想要的,其他暂时不要管
 Unity VR/AR:
Unity3D官方VR的Demo:https://unity3d.com/cn/learn/tutorials/topics/virtual-reality
Unity3D全景视频播放AVPro Video插件- http://download.csdn.net/download/java886o/9592531


1、图像规格
VR查看图像可以保存为PNG,JPEG或GIF。Google建议使用JPEG改进压缩。  
为了获得最大的兼容性和性能,图像尺寸应该是2的倍数(例如,2048或4096)。
单个图像应为2:1纵横比(例如4096×2048)。  
立体图像应为1:1纵横比(例如4096×4096)。

2、 视频规格
VR view视频应该被存储为H264编码的mp4文件。
单个视频应是2:1纵横比。
立体视频应是1:1纵横比。
一些较旧的设备不能解码的视频最大不能超过超过1080(192​​0×1080)。最大的兼容性和质量是头等大事,Google建议用户同时提供平面视.

--------------------------------------------------------

>直播播放器,推流端和拉流端

高仿全民直播(全民TV)- https://github.com/jenly1314/KingTV?ref=myread

直播播放器-哔哩哔哩(bilibili)的开源播放器https://github.com/Bilibili/DanmakuFlameMaster https://github.com/Bilibili/ijkplayer
android音视频点/直播模块开发- http://www.cnblogs.com/laughingQing/p/5884614.html

基于MediaPlayer封装的开源播放器JieCaoVideoPlayer,https://github.com/lipangit/JieCaoVideoPlayer 
弹幕使用的也是B站的开源项目https://github.com/Bilibili/DanmakuFlameMaster
弹幕库的使用可以参考郭神的文章http://blog.csdn.net/guolin_blog/article/details/51933728

Android弹幕功能实现,模仿斗鱼直播的弹幕效果- http://blog.csdn.net/guolin_blog/article/details/51933728
EvilsLive 是一个视频直播件开发工具包(SDK)- https://github.com/ThinkKeep/EvilsLive
视频直播的采集、推流、预览、播放、美图支持。
视频编码:H.264
 推流协议:RTMP
 预览与推流分辨率可分别自由设置
 支持前、后置摄像头动态切换
 支持软编、硬编及软编兼容模式
 网络自适应,可根据实际网络情况动态调整目标码率,保证流畅性
 音频编码:AAC

FFmpeg总结(十三)用ffmpeg基于nginx实现直播功能,推流拉流- https://mp.weixin.qq.com/s?__biz=MzI2OTQxMTM4OQ==&mid=2247484904&idx=1&sn=253005294f742db5b3a641622989a08d&chksm=eae1f0badd9679ac26c7359c92c24ab41a43027b8ea45bf848e5af3712186292ee95abbf5509#rd
直播app实现流程:
1.采集 2.滤镜处理 3.编码 4.推流 5.CDN分发 6.拉流 7.解码 8.播放 9.聊天互动

> 直播技术 直播+电商(采集 —>处理—>编码和封装—>推流到服务器—>服务器流分发—>播放器流播放)
Android视频直播的实现- http://blog.csdn.net/huaxun66/article/details/53427771
android端采集音视频并实时对音视频编解码(AAC/H.264)
 感觉视频流用MediaRecorder进行H264硬编码 + LocalSocket的方案可行,但要是直接可播放的流貌似应该要先发送SPS和PPS信息,包括打上时间戳等;
 音频采用AudioRecorder采集,但是硬编码AAC不可行(大部分Android不支持),软编码的话具体不知道怎么实现、包括对裸流的处理,具体需要怎样让裸流变成可播放流。
 还有推流的步骤也很关键,不知道音视频流是应该单独推还是需要合成一起去推,包含音视频流同步的问题。
这个包juv-client-client.jar支持RTMP协议推流,但是结合上面的步骤具体怎么用也不清楚,或者应该用其它支持RTMP的库?
  后期还是出现了多播和p2p的其他技术难点,软编码很简单啊,使用开源的aac编码库就行了,jni调用就可以。
  从camera的onPreviewCB获取YUV数据通过socket进行传输,另一台设备通过opengl来显示YUV数据。把Android系统自带的miracast改造成一个标准的rtsp server,完成screencast。这样在客户端只需要启动一个media client,就能观看server的屏幕。但是由于miracast的局限,所以只能1对1,不能1对多,不过可以深入改造它,应该可以完成视频直播,因为里面对于音视频的处理,流化都是完整的,只是控制部分是用的wifi-display协议,需要改一改。目前我完成的是客户端可以看见视频,但是不能听见音频

 android直播中的一些流媒体技术浅析- http://blog.csdn.net/u014673901/article/details/52817602?locationNum=4&fps=1
 直播的Android手机app,难点在于流媒体的处理,主要是对流媒体进行编码与传输,在此用H264编码,传输协议采用RTMP,流媒体服务器用nginx并进行配置。所谓视频编码方式就是指通过特定的压缩(有损 无损)技术,将某个视频格式的文件转换成另一种视频格式文件的方式。
  音频视频编码方法有很多,主要有2类:
1. 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的。
2. H.26X系列:
(由ITU[国际电传视讯联盟]主导,侧重网络传输,注意:只是视频编码) 
包括H.261、H.262、H.263、H.263+、H.263++、H.264(就是MPEG4 AVC-合作的结晶)
  压缩技术就是将数据中的冗余信息去掉(去除数据之间的相关性),压缩技术包含帧内图像数据压缩技术、帧间图像数据压缩技术和熵编码压缩技术。
H264采用的核心算法是帧内压缩和帧间压缩,帧内压缩是生成I帧的算法,帧间压缩是生成B帧和P帧的算法。

安卓直播快速实践推流端(一)- http://blog.csdn.net/qq_28268507/article/details/53098980
安卓直播快速实践拉流端(二)- http://blog.csdn.net/qq_28268507/article/details/53099076
QQ空间直播秒开优化实践 http://bugly.qq.com/bbs/forum.php?mod=viewthread&tid=1204
手Q视频直播架构及原理 http://blog.csdn.net/wishfly/article/details/53035342
淘宝直播技术分享:如何打造体验优秀的“直播+”产品 https://yq.aliyun.com/articles/62658

 推流端:https://github.com/EasyDarwin/EasyPusher
Github Demo : https://github.com/andmizi/EasyDarwin_Demo
 拉流端:https://github.com/EasyDarwin/EasyDarwin
Github Demo : https://github.com/andmizi/EasyDarwin_Demo
 server端: https://github.com/EasyDarwin/EasyDarwin/tree/master/EasyDarwin

多种封装格式:
1.RTMP协议,需要做拆包与组包,将每个数据帧拆成小分片加上协议头发送,一般用于推流;
2.FLV格式,比较简单每个数据帧加协议头,一般用于播放;
3.HLS格式,将一组音视频数据组合在一起,通过m3u8文体来关联,相当于一个个的小文件,适用于网页播放。
经典的音画同步有三种方案:音频同步到视频;音视频同步到外部时钟;视频同步到音频;

  收看直播,目前直播主要使用的协议是HLS和RTMP。FLV
Google ExoPlayer是对android标准多媒体接口MediaPlayer、MediaCodec、MediaExtractor等的封装,更接近于一个产品化的播放器。开源项目中也有应用工程demo,可以快速上手。重点是,ExoPlayer支持HLS,只需要将HLS的服务器url传给ExoPlayer并启动播放即可。多媒体文件格式可以是m3u或m3u8。
对于RTMP,需要自主开发或者寻找一些开源库的支持,Google官方目前尚无解决方案。
  发布直播可以分为两部分:音视频录制、数据上传。
音视频录制:Android提供了标准接口AudioRecord和MediaRecorder,有大量的API和成熟代码范例可以参考。
数据上传:需要自主开发一些数据通道,一端作为output数据源给Recorder,另一端连接到服务器。

---------------------------------------------------------------

  Binary XML file line #7: Error inflating class android.support.v7.widget.RecyclerView- http://blog.csdn.net/u010351494/article/details/47022601
  导入Android-Support-V7包“inconsistent”错误解决方法- http://blog.csdn.net/checkin001/article/details/47734305
是因为项目中原来有引V4包,V4包太旧了!不太懂Google是怎么设计的,V7包里的RecyclerView要依赖V4包里的控件

---------------------------------------------------------------

> 硬编/解码,软编/解码(哪种格式的音频或视频上传和下载比较省流量)
 H264是编码,而MP4则是一种容器。完美支持H265解码+HLS协议(点播+直播)
 mp4转为H265? Android使用ffmpeg和MediaCodec解码h265裸流?android MediaCodec 实现h264硬编解码?
Android利用mediacodec进行视频H264编码解码播放- http://blog.csdn.net/bit_kaki/article/details/52105733
H264视频编码成MP4文件- http://blog.csdn.net/qq_29350001/article/details/51649746
 要将H264视频编码成MP4格式。研究了一下,一种方法是采用ffmpeg库,可以先将H264文件解码,再编码生成MP4文件,但这种方式效率较低,10M的视频可能需要几秒钟才能完成。另一种方式根据MP4文件协议直接将H264包封装成MP4格式,由于是直接基于MP4的封装,因而效率很高。H264可以很方便的封装成FLV文件,但MP4格式格式相对比较复杂,封装起来会比较麻烦。由于没时间研究MP4协议,在Google Code上找到一个开源的MP4编解码库Mp4v2(https://code.google.com/p/mp4v2/),通过Mp4v2可以很方便的将H264编码成MP4格式文件。

 Android通过JAVA将H264编码成MP4(MP4Parser)- http://blog.csdn.net/qq_34706837/article/details/52674919?locationNum=6
 Android MP4Coder H264和AAC合成MP4视频库- http://blog.csdn.net/jay100500/article/details/52957837,https://github.com/zuichu/Mp4Coder
Android 解码MediaCodec 播放H264 265- http://blog.csdn.net/yulinxx/article/details/54289630
Android 用MediaCodec实现视频硬解码- http://www.cnblogs.com/shakin/p/4098949.html
何用android标准的API (MediaCodec)实现视频的硬件编解码。例程将从摄像头采集视频开始,然后进行H264编码,再解码,然后显示H.265/HEVC Codec 编解码 (MP4 和 TS)- http://blog.csdn.net/myarrow/article/details/27494877

 h264编码后的mp4(软/硬编码)
C++代码实现H264编码视频封装成avi/mp4文件- http://download.csdn.net/detail/windychen20/8179777
H264视频编码成MP4文件- http://blog.csdn.net/firehood_/article/details/8813587
android MediaCodec 实现h264硬编解码全过程- http://download.csdn.net/detail/b_xjie/8744773
Android 利用MediaCodec 实现硬编码 h264- http://blog.csdn.net/pz0605/article/details/53171577
Android通过JAVA将H264编码成MP4- http://blog.csdn.net/qq_34706837/article/details/52674919?locationNum=6
FFMPEG研究: Android下录制/dev/video0设备h264编码保存为mp4格式视频- http://blog.csdn.net/luoyouren/article/details/52119655

 Android IOS互通支持的语音和视频格式
IOS和Android都支持的格式:语音,mp3 ;视频,mp4 H.264

数码录音最关键一步就是要把模拟信号转换为数码信号,就电脑而言是把模拟声音信号录制成为音频文件。
描述音频文件主要有两个指标,一个是采样频率,或称采样率、采率,另一个是采样精度也就是比特率。
Core Audio 是iOS和 MAC 的关于数字音频处理的基础,它提供应用程序用来处理音频的一组软件框架。

关于ios 和 android 录音(语音)对聊文件格式问题- http://blog.163.com/zhuowh2006@126/blog/static/1018237242013629104918230/
android视频录制、另一部手机实时观看方案- http://blog.csdn.net/xiaoliouc/article/details/8443195
ios与android设备即时语音互通的录音格式预研说明- http://blog.csdn.net/w122079514/article/details/8535438/

iOS录制的wav文件转成amr,我们采用的是libopencore框架。
android可以转成amr,然后使用mediaplayer即可播放,iOS应该也能支持amr。
Android手机录制音频支持的格式: pcm wav和amr格式 --> 转化为 AAC格式
android使用amr,ios使用 libOpenCore第三方库进行转换;Android中的录音和播放,可保存成mp3或amr格式。
iOS 默认是 AAC 格式,后缀可以用 m4a;安卓应该也支持;录音优先选择amr格式,微信生成的语音文件就是amr格式的。
安卓手机的视频格式是什么格式:MP4和3GP。

各录音格式的解决方式总结如下:
mp3: ios,Android录制都 需要进行编码转换,使用lame第三方库,播放应该都可以直接播放
iLBC:ios支持编码解码, android 低版本不支持,不过有开源第三方库,可以进行录制编码,播放解码的处理
Speex:也是开源的第三方库,声称文件小,能降噪,需要ios,android客户端都进行编码解码处理
amr:ios 4.3之前的版本支持,以后版本都不支持amr格式,android设备支持该格式,采用这种格式,ios设备可用libOpenCore第三方库进行转换,播放时再进行解码成原始pcm进行播放。android设备可直接录制与播放
aac:两系统应该都支持的格式,但有说android设备有支持的不够好。没做测试,具体情况未知。

语音短消息的功能:前段时间为了实现语音短消息的功能,找了挺多的方案,包括amr的,aac的。不是使用amr的原因是,因为原项目中使用了g729的库和opencore-amr的库冲突了,无法使用,aac对android的兼容性好像不太好,最后决定使用speex格式进行语音压缩,有在cocoaChina上有位大神分享了一个speex的例子,但是那个并没实现ogg封装的,但是android的demo是已经加了ogg封装的,苦于对android不熟悉,只能相办法让IOS这边实现ogg封装。在国内的论坛和一些开源网站都找不到ios相关ogg封装例子,最终在github上找到了ios的speex+ogg封装的demo,十分感谢github上的那位大神,现在把ios和andoird的一起分享给大家。已经测试过可以ios和android的语音编解码可以互通的了。

手机端音视频采集、编码、压缩、音视频传输等功能;通过与后端服务器对接,优先P2P通讯,实现手机视频即拍即传、手机视频直播,手机视频录制和手机视频通话。

> 音视频的编码和解码
 在Android操作系统的智能手机上,利用无线网络通信技术,H.264编码技术和FFmpeg视频解码解决方案。
 使用MediaCodec硬编码解码。
 MediaRecorder用于录像+压缩编码,生成编码好的文件如mp4, 3gpp,视频主要是用于录制Camera preview。MediaPlayer用于播放压缩编码后的音视频文件。AudioRecord用于录制PCM数据。AudioTrack用于播放PCM数据。PCM即原始音频采样数据,可以用如vlc播放器播放。

Android-->MediaMuxer,MediaCodec,AudioRecord及Camera实现音频视频混合MP4文件- http://blog.csdn.net/angcyo/article/details/51043367

DecodeActivity解码播放H264-265影片- http://download.csdn.net/detail/yulinxx/9732744
Android摄像头采集编码H264及H264解码播放- http://download.csdn.net/download/ericfantastic/9215967

-----------------------------------------------

> 音视频的压缩和解压缩

  speex:github上面一个android speex开源项目修改封装而来,在项目中用于IM中的语音压缩和通话记录压缩。IM语音压缩不失真的情况下一分钟可以压缩到100K左右。
  基于Speex的语音压缩和解压(300K的语音文件经过Speex压缩后文件大小变为了30K左右,对于网络传输非常好)http://www.speex.org/
  在后来继续研究发现,对于语音的压缩、解压、噪音抑制、回声消除,及时通信等,WebRTC技术完全能够满足,并且特别强大,该技术被Google收购了,当然Android中也提供了实现,但是是在Android4.1版本之后,而且并不是所有的Android手机都支持,所以最好还是和Speex一样用JNI调用C/C++代码。
  WebRTC,名称源自网页实时通信(Web Real-Time Communication),和视频一样,WebRTC采用的是成熟的RTP/RTCP技术。
  Android4.1提供了开源项目WebRTC中噪音抑制,回声消除、静音 检测、自动增益控制模块的实现- http://download.csdn.net/detail/wangjiang_qianmo/9084877
  基于Speex的语音压缩和解压在Android中的实现- http://download.csdn.net/detail/wangjiang_qianmo/9083119
  speex编解码在android上实现- http://blog.csdn.net/xyz_lmn/article/details/8013490

视频压缩ffmpeg
 ffmpeg视频压缩与解压缩- http://download.csdn.net/detail/misterlanbing/6472399

-----------------------------------------------

> 音视频的上传和下载

文件的上传和下载,HttpURLConnection  OkHttp HttpClient的文件上传下载
多线程、断点续传下载,在Android上实现SSL握手(客户端需要密钥和证书),实现服务器和客户端之间Socket交互
下载管理:开始、暂停、继续、取消、重新开始

android实现ftp上传、下载文件,支持文件夹哦- http://download.csdn.net/detail/a358763471/8728637
Android中关于FTP的文件上传和下载- http://blog.csdn.net/cao185493676/article/details/50595660
Android 实现一个简单的文件上传工具 https://github.com/Othershe/DUtil
https://github.com/jeasonlzy/NineGridView

android连接socket服务器上传下载多个文件- http://blog.csdn.net/jalin_520/article/details/23922821
android中基于socket方式的文件上传- http://download.csdn.net/detail/zhangyingchengqi/8774619
pc与android通过usb socket实现手机通信Demo- http://download.csdn.net/download/lixiaodaoaaa/5854171
Android--使用TCP/IP协议实现断点上传- http://www.cnblogs.com/htc-javaMe/archive/2011/12/10/2562260.html
Java Socket通信实现文件传输/图片传输 - http://blog.chinaunix.net/uid-25885064-id-3362396.html
 Android上传文件有两种方式,第一种是基于Http协议的HttpURLConnection,第二种是基于TCP协议的Socket。 这两种方式的区别是使用HttpURLConnection上传时内部有缓存机制,如果上传较大文件会导致内存溢出。如果用TCP协议Socket方式上传就会解决这种弊端。
 Android分别使用HTTP协议和TCP协议实现上传文件- http://blog.csdn.net/furongkang/article/details/6838450
Android中Socket大文件断点上传- http://www.cnblogs.com/zhujiabin/p/5633665.html

-------------------------------------------

> SeekBar

控制seekBar的进度颜色- http://blog.csdn.net/uniquemei/article/details/51395037
Android SeekBar去掉左右两边空隙- http://blog.csdn.net/u010784887/article/details/68954245
Android音乐播放器设置播放进度条- http://blog.csdn.net/u013670933/article/details/23910767

把聊天记录放到JNI中,数据库也放到JNI中。

思路:(视频采集/编码/传输/解码/播放)
1.先写视频音频的播放,然后侧边功能 图片加水印和截屏(图片滤镜 美化???);2.录制音频和视频 
3.压缩音频视频上传,编码音视频
4.下载视频 解码音视频 播放

你可能感兴趣的:(音视频方案)