基于http live streaming视频直播在android上的实现(版本更新,支持高清AAC视频)
2012-08-23 14:05
429 查看
最近将视频客户端移植到了ANDROID平台。 分享一下开发心得。
类似HTTP LIVE STREAMING的流式下载方式, 但APPLE的TS格式冗余数据太多, 我用的是私有格式,更加节省带宽资源。H264+AMRNB编码。每个分片文件20秒。整体架构如下图:
作为HTTP下载模块对稳定性要求比较高,用NDK的话debug会很麻烦,JAVA层下载效率也还行,所以采用JAVA层的HttpURLConnection类, 服务器端在Response header里包含了下一个文件的filename,下一次的连接时将把filename作为URL的一个参数发送。这样就能做到流式的下载。 建立一个bytearrayoutputstream实例来缓存数据。 并通过JNI传递给文件解析层。
因为JAVA与JNI层数据交互很耗时,所以选择下载好一个完整文件再feed给Parser。
AUDIO必须要流畅,所以单开一个thread, Video来得及的话可以用一个timer(减少一点功耗),开一个thread也行。
H264和AMR-NB都移植自OPENCORE, 手机用baseline够了。如果要支持AAC可用helix的AAC解码器或者OPENCORE AAC Decoder.
JNI解码好再回传给JAVA层显示所造成的延时是无法忍受的,所以选择在NDK层直接render画面和声音。 可参考android ffmpeg开源工程里的做法,或者有网友已经总结提取了方法:http://www.cnblogs.com/mcodec/。 付出的代价就是可移植性, 因为现成的libjnivideo.so和libjniaudio.so都是android 2.2版本的, 其他版本会提示can not load libjnivideo.so,
需要在ANDROID工程里重新编译。 ffmpeg和android media framework的代码都可下载:https://github.com/havlenapetr
发现在NDK使用usleep时CPU占用骤增, 所以在做音视频同步的时候,最好不要用usleep.
在V880上测试,在EDGE网络较稳定的情况下, 176*144, 10帧,视频码率48k,音频码率7.95k, 可以流畅播放。 以下是真机效果。(直播我暂时用feature phone的码流 码率只有32K,画面比较模糊)
最新版本美化了UI, 更加稳定优化的播放内核。 适配2.2以及2.3--4.0平台,2.3以上采用opengles+opensl es的方式渲染音视频。
支持标清(48-60k码率, H264+AMRNB编码),高清视频(300k-400k码率, H264+AAC编码)。效果见下图
类似HTTP LIVE STREAMING的流式下载方式, 但APPLE的TS格式冗余数据太多, 我用的是私有格式,更加节省带宽资源。H264+AMRNB编码。每个分片文件20秒。整体架构如下图:
作为HTTP下载模块对稳定性要求比较高,用NDK的话debug会很麻烦,JAVA层下载效率也还行,所以采用JAVA层的HttpURLConnection类, 服务器端在Response header里包含了下一个文件的filename,下一次的连接时将把filename作为URL的一个参数发送。这样就能做到流式的下载。 建立一个bytearrayoutputstream实例来缓存数据。 并通过JNI传递给文件解析层。
因为JAVA与JNI层数据交互很耗时,所以选择下载好一个完整文件再feed给Parser。
AUDIO必须要流畅,所以单开一个thread, Video来得及的话可以用一个timer(减少一点功耗),开一个thread也行。
H264和AMR-NB都移植自OPENCORE, 手机用baseline够了。如果要支持AAC可用helix的AAC解码器或者OPENCORE AAC Decoder.
JNI解码好再回传给JAVA层显示所造成的延时是无法忍受的,所以选择在NDK层直接render画面和声音。 可参考android ffmpeg开源工程里的做法,或者有网友已经总结提取了方法:http://www.cnblogs.com/mcodec/。 付出的代价就是可移植性, 因为现成的libjnivideo.so和libjniaudio.so都是android 2.2版本的, 其他版本会提示can not load libjnivideo.so,
需要在ANDROID工程里重新编译。 ffmpeg和android media framework的代码都可下载:https://github.com/havlenapetr
发现在NDK使用usleep时CPU占用骤增, 所以在做音视频同步的时候,最好不要用usleep.
在V880上测试,在EDGE网络较稳定的情况下, 176*144, 10帧,视频码率48k,音频码率7.95k, 可以流畅播放。 以下是真机效果。(直播我暂时用feature phone的码流 码率只有32K,画面比较模糊)
最新版本美化了UI, 更加稳定优化的播放内核。 适配2.2以及2.3--4.0平台,2.3以上采用opengles+opensl es的方式渲染音视频。
支持标清(48-60k码率, H264+AMRNB编码),高清视频(300k-400k码率, H264+AAC编码)。效果见下图
相关文章推荐
- 基于http live streaming视频直播在android上的实现(版本更新,支持高清AAC视频)
- 基于http live streaming视频直播在android上的实现(版本更新,支持高清AAC视频)
- Android实现App版本自动更新
- 【Ionic】Ionic实现iOS与Android端代码『热更新』与Android升级下载功能 ( v1.3.x版本 )
- Node.js实现android的apk版本更新服务器
- Android实现App版本自动更新
- android检查版本更新实现思路
- 用友盟的自动更新组件实现Android应用版本升级
- Android 实现图片、视频即时更新到相册
- (更新版)Android VideoPlayer 在滚动列表实现item视频播放(ListView控件和RecyclerView)
- Delphi编写的Android程序获取Root权限实现(2015.4.15更新,支持Android 4.4)
- Android App 版本更新实现
- unity3d开发android小游戏版本版本更新后自动安装功能的实现
- [Android--Tool]更新SDK后ADT版本低不支持问题的解决
- Android app“版本更新”功能的前后端实现
- 基于rtsp的手机视频点播实现和研究(扩展支持android, ios平台)
- Android提示版本更新的实现
- Android 轻松实现后台搭建+APP版本更新
- 使用android自带的DownloadManager来实现版本更新
- Android实现数据库版本更新(修改字段、增加字段、删除字段等)