求手机能h.264播放器H.264视频h.264播放器器的开源代码

新浪广告共享计划>
广告共享计划
基于ffmpeg的Android播放器开源代码&Posted&on&&11:40&mcodec&阅读(1964)&评论(68)&&编辑&收
博客分类:
/mcodec/articles/1780598.html
基于ffmpeg的Android播放器开源代码
11:40 mcodec 阅读(1964) 评论(68)&
本开源Android播放器基于ffmpeg开发,音视频在jni层直接输出,不使用java层的bmp和audiotrack输出,支持arm汇编加速,超级精简。
本开源代码播放器使用的音视频解码代码来源于ffmpeg-0.6.3(http://www.ffmpeg.org),
jni衔接代码和java层代码来源于havlenapetr(/havlenapetr/FFMpeg)。
移植ffmpeg到android的常规关键点网上有很多的帖子可以参考,也可以用文件夹比较工具比较一下,看看添加修改删除了那些文件。
本开源代码的编译环境
1: Android SDK 2.2版,
2: NDK r4版,注意要导出NDK宏,
3: IDE开发环境是 eclips 3.5 版
4: libffplay.so是在Android
2.2版源码目录树中编译出来的,使用Ubuntu10.04和VMware7.1.1版,目前源码不公开
5: libffmpeg.so编译步骤,cd /cygwin/c/ffplay, ./config_r4.sh,
$NDK/ndk-build
6: PC主机开发环境是windows xp。
特别注意,此demo只能在 Android SDK 2.2版上使用,其他版本有修改源码,重新编译才行。
此开源代码解决了几个特别关键点,达到实用水平。几个关键点如下:
1:arm汇编代码编译支持,主要是在几个.mk文件中添加LOCAL_ARM_MODE := arm语句,
在config_r4.sh文件中添加--arch=armv5te和--enable-asm 等开关。
2:在ffmpeg config_r4.sh配置文件中关闭了一些不用的选项后,连接时总是报一些莫名其妙的连接错误,
本开源代码给出终极解决方案(在/jni/jni/Android.mk文件中添加 LOCAL_LDLIBS +=
C:/ffplay/bin/ndk/local/armeabi/libavcodec.a等语句)。
3:修改havlenapetr中的视频显示错误bug,经测试havlenapetr原始代码在模拟器设置为320x480时显示正确,在更大的分辨率下显示错误,
本开源代码已修改好此bug,现在无论什么分辨率都可以正确显示。
此开源代码其他注意事项:
1:jni衔接代码相比havlenapetr精简了几个数量级,更方便网友们研习。
2:此开源代码不包括play,pause,stop,seek和视音频同步等功能实现代码,这部分代码不开源。
3:Android jni层直接输出音频示例,Android
jni层直接输出视频示例,基于ffmpeg的Android播放器开源代码,三个工程使用相同的库,相同的方法和技巧,可相互参考。
在moto defy me525上测试通过。
&欢迎下载研习:
/mcodec/ffplay1.7z
& apk包下载:&&
/mcodec/ffplay1.apk.7z
分类: Android
标签: ffmpeg NDK android
===========
H264解码器源码(Android 1.6 版)
13:04 mcodec 阅读(12293)
评论(166)& 编辑 收藏
H264解码器源码,移植ffmpeg中的H264解码部分到Android,深度删减优化,在模拟器(320x480)中验证通过。
程序的采用jni架构。界面部分,文件读取,视频显示都是用java做的,底层的视频解码用C来做满足速度的要求。
在这个版本中,从H264码流中分割出Nal是在java层做的,这样在java层直接调用解码时就知道是否有显示视频,缺点的就是耦合度/封装性差一点。
如果采用在底层做Nal分割的方法,可以封装得好看一些,但是每次送的数据有限制,如果送的数据太多,底层可能会一次解码出好几帧视频,但是通知到界面层只能显示一帧,造成丢帧的现象。
如果每次送的数据较少,就会有很多次底层调用没有进行实质解码,很小气的做法,比如有一压缩数据帧需要600字节,如果一次送100个字节给解码器,那么要送6次才会进行实质解码,因为每个数据帧有大有小,所以只能取极小值才不会导致丢帧。
不过所有的编码解码都是各种因素平衡折中的结果,具体用什么方法具体分析。
如果程序崩溃退出,优先考虑:
1)是否是baseline
2)byte [] NalBuf = new byte[40980]; 缓冲区是否溢出。
如果有B帧,那肯定不是baseline。
为便于支持不同分辨率的码流,修改了代码。现在只需要修改H264Android.java文件中第51,74,75行就可测试新分辨率。
有些大分辨率的码流可能会异常,优先修改H264Android.java文件中第161行把Nal缓冲区改大。
两版本都是用 android-ndk-1.6_r1-windows.zip 和 cygwin 1.7.5-1, gcc4
4.3.4-3 (用 cygcheck -c查看) 编译。
注意 /jni/H264Android.cpp文件添加了extern "C" 关键声明。
解码源码下载地址:/mcodec/H264Android.7z&
C++版本下载地址:/mcodec/H264Android_CPP.7z
测试码流(240x320)下载地址:/mcodec/butterfly.h264.rar
测试码流(352x288)下载地址:/mcodec/352x288.264.7z
分类: H264 Decoder
标签: H264 decoder android code 源码
绿色通道:好文要顶关注我收藏该文与我联系
posts - 32, comments - 454, trackbacks - 0, articles -
<img src="/blog7style/images/common/sg_trans.gif" real_src ="/Skins/KJC/Images/icon-group.jpg" ALIGN="left" VSPACE="2" HSPACE="5"
ALT="基于ffmpeg的Android播放器开源代码&Posted&on&&11:40&mcodec&阅读(1964)&评论(68)&&编辑&收"
TITLE="基于ffmpeg的Android播放器开源代码&Posted&on&&11:40&mcodec&阅读(1964)&评论(68)&&编辑&收" />
<img src="/blog7style/images/common/sg_trans.gif" real_src ="/Skins/KJC/Images/icon-group.jpg" ALIGN="left" VSPACE="2" HSPACE="5"
ALT="基于ffmpeg的Android播放器开源代码&Posted&on&&11:40&mcodec&阅读(1964)&评论(68)&&编辑&收"
TITLE="基于ffmpeg的Android播放器开源代码&Posted&on&&11:40&mcodec&阅读(1964)&评论(68)&&编辑&收" />
<img src="/blog7style/images/common/sg_trans.gif" real_src ="/Skins/KJC/Images/icon-group.jpg" ALIGN="left" VSPACE="2" HSPACE="5"
ALT="基于ffmpeg的Android播放器开源代码&Posted&on&&11:40&mcodec&阅读(1964)&评论(68)&&编辑&收"
TITLE="基于ffmpeg的Android播放器开源代码&Posted&on&&11:40&mcodec&阅读(1964)&评论(68)&&编辑&收" />
文章分类(50)
<img src="/blog7style/images/common/sg_trans.gif" real_src ="/Skins/KJC/Images/icon-group.jpg" ALIGN="left" VSPACE="2" HSPACE="5"
ALT="基于ffmpeg的Android播放器开源代码&Posted&on&&11:40&mcodec&阅读(1964)&评论(68)&&编辑&收"
TITLE="基于ffmpeg的Android播放器开源代码&Posted&on&&11:40&mcodec&阅读(1964)&评论(68)&&编辑&收" />
文章档案(50)
<img src="/blog7style/images/common/sg_trans.gif" real_src ="/Skins/KJC/Images/icon-group.jpg" ALIGN="left" VSPACE="2" HSPACE="5"
ALT="基于ffmpeg的Android播放器开源代码&Posted&on&&11:40&mcodec&阅读(1964)&评论(68)&&编辑&收"
TITLE="基于ffmpeg的Android播放器开源代码&Posted&on&&11:40&mcodec&阅读(1964)&评论(68)&&编辑&收" />
积分与排名
积分 - 28660
排名 - 3638
<img src="/blog7style/images/common/sg_trans.gif" real_src ="/Skins/KJC/Images/icon-group.jpg" ALIGN="left" VSPACE="2" HSPACE="5"
ALT="基于ffmpeg的Android播放器开源代码&Posted&on&&11:40&mcodec&阅读(1964)&评论(68)&&编辑&收"
TITLE="基于ffmpeg的Android播放器开源代码&Posted&on&&11:40&mcodec&阅读(1964)&评论(68)&&编辑&收" />
--jemmy Liu
我用博主的解码, 确实会整个萤幕消失崩溃, 经过我努力debug, 每次运行到h264.c里的decode_mb_cavlc,
就会整个萤幕消失, 这个decode_mb_cavlc很大, 很难具体再debug出到底哪一个细节造成crash,
这个decode_mb_cavlc如果移除, 就不会有萤幕退出的问题, 博主觉得是什么问题吗? 我是用Rtp Socket收Rtp
Packet去解码的, ...
对了 博主,这个移植前的H264解码库的对外头文件是哪个,也就是说移植前库所暴露的接口是什么
--haoruifly
mcodec,的确很可能是不同步的问题。这个同步怎么来判断和解决呢?能否指点一下?
--lanlamer
非常感谢博主,我的程序已经能够成功运行,“play,pause,stop,seek和视音频同步等功能实现代码,这部分代码不开源”,请问这些必须要自己去实现吗?
--zhangyuanjian
@lanlamer,多半是你调用play_inputdata函数送的数据
和大华sdk需要的数据不同步,可能是sdk需要数据的时侯你没有及时送到,你送数据的时候sdk暂时还不接收数据,结果导致sdk内部的数据缓存乱了,
死活播不出来。自己写播放器分两个层次,一个是用sdk包做解码,自己做上层的界面,另一个层次是自己做编解码库。如果只做简单的界面,简单了解一些音视
频标准,主要是做好数据同步的问题。如果自...
@haoruifly,nativePlay和 ffplayAndroid_play是在static
JNINativeMethod
methods[]数据结构中关联在一起,调用jniRegisterNativeMethods函数注册后,可以简单认为这两函数是同一个函数。
h264android.c中的视频输出是在java层用bmp序列函数实现的,所以要有DeleteYUVTab()等yuv到rgb56...
对了博主 对于一个开源库移植android和软件或者C写的客户端什么的移植android有什么区别吗?
--haoruifly
我看了那个jni层直接输出视频的代码,在.java中
nativePlay()是接口函数,可是在FFMpegPlayerAndroid.cpp中既没有找到这个接口函数的代码的实现部分,也没有在头文件
中包含#include
&jni.h&还有就是不但木有找到接口函数nativePlay()的实现代码,怎么又把不是接口函数的两个函数
jniRegisterNativeMethods()和 FFMpegPl...
--haoruifly
@mcodec您好!我把输入到PLAY_InputData的数据保存成文
件后,可以使用大华播放器SDK自带的示例程序来播放,可是直接把从网络接收到的视频流输入到PLAY_InputData就死活不能播放。能否请您帮忙
看看或者帮忙调试一下?或者指点一线获取视频流后到显示出来(如果自己编写播放器)需要看哪些资料?非常感谢!我的QQ:.
--lanlamer
摘要: Android在jni层直接输出音频示例。
mcodec 阅读(543) |
摘要: Android jni 层直接输出视频示例
mcodec 阅读(858) |
摘要: 基于ffmpeg的Android播放器开源代码,
音视频在jni层直接输出,不使用java层的bmp和audiotrack输出,支持arm汇编加速
mcodec 阅读(1963) |
摘要: Android 1.6平台用AudioTrack输出PCM音频
mcodec 阅读(898) |
(本站所有文章都是原创,转载请注明出处)
posts - 32, comments - 454, trackbacks - 0, articles -
<img src="/blog7style/images/common/sg_trans.gif" real_src ="/Skins/KJC/Images/icon-group.jpg" ALIGN="left" VSPACE="2" HSPACE="5"
ALT="基于ffmpeg的Android播放器开源代码&Posted&on&&11:40&mcodec&阅读(1964)&评论(68)&&编辑&收"
TITLE="基于ffmpeg的Android播放器开源代码&Posted&on&&11:40&mcodec&阅读(1964)&评论(68)&&编辑&收" />
<img src="/blog7style/images/common/sg_trans.gif" real_src ="/Skins/KJC/Images/icon-group.jpg" ALIGN="left" VSPACE="2" HSPACE="5"
ALT="基于ffmpeg的Android播放器开源代码&Posted&on&&11:40&mcodec&阅读(1964)&评论(68)&&编辑&收"
TITLE="基于ffmpeg的Android播放器开源代码&Posted&on&&11:40&mcodec&阅读(1964)&评论(68)&&编辑&收" />
<img src="/blog7style/images/common/sg_trans.gif" real_src ="/Skins/KJC/Images/icon-group.jpg" ALIGN="left" VSPACE="2" HSPACE="5"
ALT="基于ffmpeg的Android播放器开源代码&Posted&on&&11:40&mcodec&阅读(1964)&评论(68)&&编辑&收"
TITLE="基于ffmpeg的Android播放器开源代码&Posted&on&&11:40&mcodec&阅读(1964)&评论(68)&&编辑&收" />
文章分类(50)
<img src="/blog7style/images/common/sg_trans.gif" real_src ="/Skins/KJC/Images/icon-group.jpg" ALIGN="left" VSPACE="2" HSPACE="5"
ALT="基于ffmpeg的Android播放器开源代码&Posted&on&&11:40&mcodec&阅读(1964)&评论(68)&&编辑&收"
TITLE="基于ffmpeg的Android播放器开源代码&Posted&on&&11:40&mcodec&阅读(1964)&评论(68)&&编辑&收" />
文章档案(50)
<img src="/blog7style/images/common/sg_trans.gif" real_src ="/Skins/KJC/Images/icon-group.jpg" ALIGN="left" VSPACE="2" HSPACE="5"
ALT="基于ffmpeg的Android播放器开源代码&Posted&on&&11:40&mcodec&阅读(1964)&评论(68)&&编辑&收"
TITLE="基于ffmpeg的Android播放器开源代码&Posted&on&&11:40&mcodec&阅读(1964)&评论(68)&&编辑&收" />
积分与排名
积分 - 28660
排名 - 3638
<img src="/blog7style/images/common/sg_trans.gif" real_src ="/Skins/KJC/Images/icon-group.jpg" ALIGN="left" VSPACE="2" HSPACE="5"
ALT="基于ffmpeg的Android播放器开源代码&Posted&on&&11:40&mcodec&阅读(1964)&评论(68)&&编辑&收"
TITLE="基于ffmpeg的Android播放器开源代码&Posted&on&&11:40&mcodec&阅读(1964)&评论(68)&&编辑&收" />
--jemmy Liu
我用博主的解码, 确实会整个萤幕消失崩溃, 经过我努力debug, 每次运行到h264.c里的decode_mb_cavlc,
就会整个萤幕消失, 这个decode_mb_cavlc很大, 很难具体再debug出到底哪一个细节造成crash,
这个decode_mb_cavlc如果移除, 就不会有萤幕退出的问题, 博主觉得是什么问题吗? 我是用Rtp Socket收Rtp
Packet去解码的, ...
对了 博主,这个移植前的H264解码库的对外头文件是哪个,也就是说移植前库所暴露的接口是什么
--haoruifly
mcodec,的确很可能是不同步的问题。这个同步怎么来判断和解决呢?能否指点一下?
--lanlamer
非常感谢博主,我的程序已经能够成功运行,“play,pause,stop,seek和视音频同步等功能实现代码,这部分代码不开源”,请问这些必须要自己去实现吗?
--zhangyuanjian
@lanlamer,多半是你调用play_inputdata函数送的数据
和大华sdk需要的数据不同步,可能是sdk需要数据的时侯你没有及时送到,你送数据的时候sdk暂时还不接收数据,结果导致sdk内部的数据缓存乱了,
死活播不出来。自己写播放器分两个层次,一个是用sdk包做解码,自己做上层的界面,另一个层次是自己做编解码库。如果只做简单的界面,简单了解一些音视
频标准,主要是做好数据同步的问题。如果自...
@haoruifly,nativePlay和 ffplayAndroid_play是在static
JNINativeMethod
methods[]数据结构中关联在一起,调用jniRegisterNativeMethods函数注册后,可以简单认为这两函数是同一个函数。
h264android.c中的视频输出是在java层用bmp序列函数实现的,所以要有DeleteYUVTab()等yuv到rgb56...
对了博主 对于一个开源库移植android和软件或者C写的客户端什么的移植android有什么区别吗?
--haoruifly
我看了那个jni层直接输出视频的代码,在.java中
nativePlay()是接口函数,可是在FFMpegPlayerAndroid.cpp中既没有找到这个接口函数的代码的实现部分,也没有在头文件
中包含#include
&jni.h&还有就是不但木有找到接口函数nativePlay()的实现代码,怎么又把不是接口函数的两个函数
jniRegisterNativeMethods()和 FFMpegPl...
--haoruifly
@mcodec您好!我把输入到PLAY_InputData的数据保存成文
件后,可以使用大华播放器SDK自带的示例程序来播放,可是直接把从网络接收到的视频流输入到PLAY_InputData就死活不能播放。能否请您帮忙
看看或者帮忙调试一下?或者指点一线获取视频流后到显示出来(如果自己编写播放器)需要看哪些资料?非常感谢!我的QQ:.
--lanlamer
阅读(1964)
<img src="/blog7style/images/common/sg_trans.gif" real_src ="/mcodec/aggbug/2114714.html?type=2&webview=1" ALT="" WIDTH="1px" HEIGHT="1px"
TITLE="基于ffmpeg的Android播放器开源代码&Posted&on&&11:40&mcodec&阅读(1964)&评论(68)&&编辑&收" />
本开源Android播放器基于ffmpeg开发,音视频在jni层直接输出,不使用java层的bmp和audiotrack输出,支持arm汇编加速,超级精简。
本开源代码播放器使用的音视频解码代码来源于ffmpeg-0.6.3(http://www.ffmpeg.org),
jni衔接代码和java层代码来源于havlenapetr(/havlenapetr/FFMpeg)。
移植ffmpeg到android的常规关键点网上有很多的帖子可以参考,也可以用文件夹比较工具比较一下,看看添加修改删除了那些文件。
本开源代码的编译环境
1: Android SDK 2.2版,
2: NDK r4版,注意要导出NDK宏,
3: IDE开发环境是 eclips 3.5 版
4: libffplay.so是在Android
2.2版源码目录树中编译出来的,使用Ubuntu10.04和VMware7.1.1版,目前源码不公开
5: libffmpeg.so编译步骤,cd /cygwin/c/ffplay, ./config_r4.sh,
$NDK/ndk-build
6: PC主机开发环境是windows xp。
特别注意,此demo只能在 Android SDK 2.2版上使用,其他版本有修改源码,重新编译才行。
此开源代码解决了几个特别关键点,达到实用水平。几个关键点如下:
1:arm汇编代码编译支持,主要是在几个.mk文件中添加LOCAL_ARM_MODE := arm语句,
在config_r4.sh文件中添加--arch=armv5te和--enable-asm 等开关。
2:在ffmpeg config_r4.sh配置文件中关闭了一些不用的选项后,连接时总是报一些莫名其妙的连接错误,
本开源代码给出终极解决方案(在/jni/jni/Android.mk文件中添加 LOCAL_LDLIBS +=
C:/ffplay/bin/ndk/local/armeabi/libavcodec.a等语句)。
3:修改havlenapetr中的视频显示错误bug,经测试havlenapetr原始代码在模拟器设置为320x480时显示正确,在更大的分辨率下显示错误,
本开源代码已修改好此bug,现在无论什么分辨率都可以正确显示。
此开源代码其他注意事项:
1:jni衔接代码相比havlenapetr精简了几个数量级,更方便网友们研习。
2:此开源代码不包括play,pause,stop,seek和视音频同步等功能实现代码,这部分代码不开源。
3:Android jni层直接输出音频示例,Android
jni层直接输出视频示例,基于ffmpeg的Android播放器开源代码,三个工程使用相同的库,相同的方法和技巧,可相互参考。
在moto defy me525上测试通过。
&欢迎下载研习:&&
& apk包下载:
绿色通道:
(请您对文章做出评价)
    &&
16:26 by &
请问 博主 把源码下过来
是不是自己得把libffmpeg.so库文件编译出来呢?libffplay.so库文件就存放在工程的根目录吗?
    &&
17:33 by &
。。ffplay\jni\libffmpeg目录下ndk-build生成libffmpeg.so好像有问题呢
。。恳请回答啊
你确认一下目录路径,整个工程解压到c盘根目录,然后在编译libffmpeg.so时,拷贝libffplay.so到C:/ffplay/bin
/ndk/local/armeabi/libffplay.so。生成libffmpeg.so后,还要拷贝libffplay.so到
C:\ffplay\libs\armeabi\libffplay.so,最后生成apk文件。
    &&
23:21 by &
谢博主回复。。现在能生成libffmpeg.so了。但是在自己的笔记本上点击flv、mp4播放文件。直接模拟器被迫关闭。重建一个模拟器还是一样。
在学校的电脑上可以播放。。不知道为什么。还想请问博主。如果我想要在2.1的模拟器上跑这段程序。是不是自己要编译libffplay.so库文件呢。
这个能告诉我编译这个库文件的步骤是什么吗?还有请问博主。想做音视频同步的话有什么能参考的吗?灰常感谢!!!
博主你好. 请问在其它项目使用. 音视频jni层直接输出 . 是不是只要用到. libffplay.so 就行了
? 或者在之前的H264Android_CPP.7z 使用jni 层直接输出. 需要哪些步骤 ?
@free2010,在其他项目中使用音视频jni层直接输出,只要用libffplay.so即可,函数调用参数和顺序请参考压缩包中的ffplayAndroid.cpp文件。
本博客博主:@free2010,在其他项目中使用音视频jni层直接输出,只要用libffplay.so即可,函数调用参数和顺序请参考压缩包中的ffplayAndroid.cpp文件。
博主你好.请问一下. 怎么把解码后的RGB565视频. 转换成一张BMP 图片
? 我试了下面的方法不能正常生成
signed char *decodepixel
解码后的RGB_565 数据 , 有时间麻烦帮我看一下 . 谢谢先
int result = createBmp(path, (uint8_t *)decodepixel,
352,288,32);
int createBmp(const char *filename, uint8_t *pRGBBuffer, int width,
int height, int bpp)
BITMAPFILEHEADER
BITMAPINFO
FILE *fp = NULL;
fp = fopen(filename,"w+");
if(fp == NULL )
bmpheader.bfType = ('M'
bmpheader.bfReserved1 = 0;
bmpheader.bfReserved2 = 0;
bmpheader.bfOffBits = sizeof(BITMAPFILEHEADER) +
sizeof(BITMAPINFOHEADER);
bmpheader.bfSize = bmpheader.bfOffBits + width*height*bpp/8;
bmpinfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmpinfo.bmiHeader.biWidth =
bmpinfo.bmiHeader.biHeight = 0 -
bmpinfo.bmiHeader.biPlanes = 1;
bmpinfo.bmiHeader.biBitCount =
bmpinfo.bmiHeader.biCompression = 0;
bmpinfo.bmiHeader.biSizeImage = 0;
bmpinfo.bmiHeader.biXPelsPerMeter = 100;
bmpinfo.bmiHeader.biYPelsPerMeter = 100;
bmpinfo.bmiHeader.biClrUsed = 0;
bmpinfo.bmiHeader.biClrImportant = 0;
fwrite(&bmpheader,sizeof(BITMAPFILEHEADER),1,fp);
fwrite(&bmpinfo.bmiHeader,sizeof(BITMAPINFOHEADER),1,fp);
fwrite(pRGBBuffer,width*height*bpp/8,1,fp);
fclose(fp);
fp = NULL;
free2010:
博主你好.请问一下. 怎么把解码后的RGB565视频. 转换成一张BMP 图片
? 我试了下面的方法不能正常生成
signed char *decodepixel
解码后的RGB_565 数据 , 有时间麻烦帮我看一下 . 谢谢先
int result = createBmp(path, (uint8_t *)decodepixel,
352,288,32);
int createBmp(const char *filename, uint8_t *pRGBBuffer, int width,
int height, int bpp)
现在能存成bmp 图片. 不过色彩不对.
@free2010,如果是rgb24位或rgb32位色bmp位图,好像实际保存的顺序是bgr序,这个你可以用Paint画纯色的r,g,b三位图,然后用ultraedit等编辑器看二进制数据确认,颜色不对很可能是bgr顺序没对。
    &&
15:31 by &
楼主能做一个从网上接受到的视频裸数据的解码播放器吗?
本博客博主:@free2010,如果是rgb24位或rgb32位色bmp位图,好像实际保存的顺序是bgr序,这个你可以用Paint画纯色的r,g,b三位图,然后用ultraedit等编辑器看二进制数据确认,颜色不对很可能是bgr顺序没对。
好的. 谢谢
libffplay.so怎么生成的?
4: libffplay.so是在Android
2.2版源码目录树中编译出来的,使用Ubuntu10.04和VMware7.1.1版。
目前源码不公开。
博主 .有时间帮我们这些小菜鸟写个ffmpeg 编码的例子. 相信大家都在等着 .
    &&
11:08 by &
本博客博主:
4: libffplay.so是在Android
2.2版源码目录树中编译出来的,使用Ubuntu10.04和VMware7.1.1版。
目前源码不公开。
楼主,是必须下载整个源码吗?不可以只下载要用到的某部分源码吗?
Blue,我是用repo之类的命令下载android2.2整个源码包,删掉.git之类的隐藏文件,用7z压缩后大约650M左右。
没试过只下载部分代码就编译,并且里面头文件包含关系错综复杂,没相当的功底,拆分很困难,还不如下完整简单些。
    &&
17:42 by &
博主,我尝试了用cywin来下载源码,确实比较坑爹,很多问题。编译的话看来是得用linux了。目前源码的镜像服务站上是最新的源码,如果只要某个版本的源码,可以用什么命令呢?为什么不同版本的源码编译出来的so库,其他版本的机子调用,会load不了那个so库?
Blue,在ubuntu10系统,下什么版本到网上google一下,类似于攻略的帖子很多,照着做就可以了。
可能因为开源各个手机厂家有改动,造成模拟器和真机不同,看来google的兼容性是比较大问题。
    &&
18:55 by &
本博客博主
像博主参考的那个开源项目,编译出来使用的so库,也是有版本兼容问题,我是不懂,在2.2源码里编译出来的,为什么在2。1会用不了,都是在模拟器上运行,不存在厂家改动的问题。在加载动态库的时候,是什么原因导致加载失败呢?
    &&
16:50 by &
Blue,高版本编译出来的库,底版本SDK用不了,这个可以理解,因为谁也不知道后来库又改了多少。现在是底版本编译出来的库,高版本SDK也用不了,这个就是兼容性太差了。
至于什么原因,可能需要看日志了,或者可能看日志也看不出所以然来。
目前看来,windows的兼容性做得最好了。
请问 "音视频在jni层直接输出,不使用java层的bmp和audiotrack输出",
音视频在jni层怎么实现直接输出?表示怀疑。你的播放器支持android哪些版本?
    &&
08:44 by &
在java层用bmp和audiotrack是可以输出视频和音频的,但是java层的调用最终会转入底层的c/c++代码,实际的视频和音频输出是底层
的c/c++做的,所以可以在android的源码目录树中用c/c++实现一个简单封装音视频输出的动态库,再在jni层调用封装的动态库输出音视频,
这样就不需要java层参与了,实现在jni层直接输出音视频。我这样讲不知你是否明白。
本开源代码支持2.2版本,在模拟器和moto defy me525上都测试通过。
    &&
10:36 by &
谢博主一直以来的答复。视频的输出是使用RGB565的格式来输出,是属于贴图的方式。但由ffmpeg解码得到的帧是YUV420的,不知博主是否知道
实现渲染YUV格式的帧数据的方法。我查过很多资料后,貌似渲染YUV格式的是通过调用硬件来实现,这样的话我们这种第三方应用就没办法使用了
    &&
09:35 by &
貌似目前在android上不能直接输出YUV视频,需要转换为RGB格式才能输出。
貌似RGB格式也能做overlay输出。
    &&
09:59 by &
其实性能的消耗就在于将YUV转RGB这一部,即使是RGB可以用overlay来输出,也没有多大的作用。最主要是找到可以直接输出YUV视频的方法啊
    &&
09:33 by &
博主,对于播放网络音频文件,实现思路应该是怎么样的呢?主要是如何及时处理快退功能
    &&
16:01 by &
请教博主处理方式在编译NDK的时候:
出现以下问题:
SharedLibrary : libffmpeg.so
arm-linux-androideabi-g++.exe:
C:/ffplay/bin/ndk/local/armeabi/libavcodec.a: No such file or
arm-linux-androideabi-g++.exe:
C:/ffplay/bin/ndk/local/armeabi/libavformat.a: No such file or
arm-linux-androideabi-g++.exe:
C:/ffplay/bin/ndk/local/armeabi/libavutil.a: No such file or
arm-linux-androideabi-g++.exe:
C:/ffplay/bin/ndk/local/armeabi/libswscale.a: No such file or
arm-linux-androideabi-g++.exe:
C:/ffplay/bin/ndk/local/armeabi/libffplay.so: No such file or
[/cygdrive/e/tmpfile/ffplay1/obj/local/armeabi/libffmpeg.so] Error
    &&
16:33 by &
我是用ndk-r4编译的,看目录你是用r5的,r4和r5生成的obj文件路径不同。
要不你用r4编译,
要不你改路径,看你的错误提示似乎应该改成
e:/tmpfile/ffplay1/obj/local/armeabi/libavcodec.a
    &&
21:03 by &
libffplaye.so博主是参照havlenapetr的video改的吧,确实效率都耗在YUV转RGB上了,其实真机的话都实现了overlay的输出,havlenapetr的改版好像输出方式有改变
    &&
21:32 by &
我已经根据楼主上面说的,把工程放到c盘,根目录下,请问是改什么路径?工程路径?thank you 楼主
    &&
10:17 by &
楼主,我已经编译生成apk文件了,但是放在真实的机子上测试,apk安装时提示“解析包时出现问题”,机型是ME511,谢谢
    &&
10:58 by &
楼主在2.2的机子上可以跑,但是进去后点击不了文件是暗色,怎么不能播放,附图
    &&
13:41 by &
@elias,貌似在FFMpegFileExplorer.java文件中用EXTENSIONS数组限定了播放文件的后缀名,你改一下就可以了。
    &&
16:58 by &
不好意思啊,我刚才发现了,改了,这么低级的问题,还问博主,实在不好意思
    &&
20:01 by &
比较了你的jni,与havlenapetr相比,确实精简很多啊。
jni衔接代码相比havlenapetr
    &&
20:25 by &
能不能在2.1的目录树下写一个ffplay.so编译,然后用到你的ffmege.so?
因为libffmege.so 生成一定要依赖到libffmpeg.so,不公开的ffplay.so
与libffmege耦合很强吗?如果是自己写的ffplay 要注意哪些接口?
    &&
10:58 by &
博主,在你的ffplayAndroid.java中
public class ffplayAndroid extends SurfaceView {
private Thread mRenderT
private Context mC
private SurfaceHolder mSurfaceH
private MediaController mMediaC
private boolean mP
可以把最后一个参数 换成
private Player mP
是不是可以实现调用自己写的player?
    &&
17:25 by &
@elias,在Android
2.3.1源码树中编译出来的2.3.1版本,在模拟器上不能跑,没在真机上测试;同样的代码在Android2.2源码树中编译出来的版本只能在2.2上用。
貌似Android的兼容性太差,没信心保证2.1能过,因此没有编译。
    &&
22:50 by &
楼主在你的
ffplayer/jni/include/driver_map.h里面有一些类似AndroidAudioTrack_register的函数应该调到博主为公开的libfflayer.so库里,需要写这些函数
我 在网上看到这些函数会调用libjniaudio libjnivideo,使用havlenapetr /
android_frameworks_base /native/video和audio,但是我git
下了android_frameworks_base 已经没有video
和audio这两个文件夹了,楼主可否告诉旧版本的android_frameworks_base,项目真的很急啊,谢谢楼主
    &&
10:38 by &
@elias,旧版的video有bug,并且2.3以后不能用,2.1没有测试不确定,仅2.2能用。如果你仅仅使用,拿我这个libffplay.so就够了。
如果你要自己写,audio部分数据量小,回传给java层用audiotrack输出就够了,video部分改bug也是整死人。
我已经很久没有去havlenapetr了,如果你下不了,我也下不了
    &&
00:26 by &
libffplay.so只能在2.2上调用,我在2.1上编译video
的确很多bug,请问你的video在2.2上面的bug是什么啊?
    &&
10:21 by &
楼主,havlenapetr原始代码在模拟器设置为320x480时显示正确,在更大的分辨率下显示错误,这个错误是什么导致的?怎么修改呢?请给些提示
    &&
13:14 by &
@Lan Blue,我改的是libjnivideo.so,重新做了个libffplay.so。
但网上也有人说改OnVideoSizeChangedListener()相关函数。
你自己熟悉哪个就改哪个。
    &&
13:46 by &
楼主,我的意思是为什么在别的分辨率下会没办法显示?是因为视频帧的大小超过了屏幕的大小,导致无法显示,还是其他原因?
    &&
14:21 by &
@Lan Blue,在别的分辨率下是显示不正确,不是没办法显示。
不是视频大小的原因。
自己悟吧,悟到了改起来快捷。
    &&
10:04 by &
I got a error as below while compiled the source code
using NDK 6b and NDK 5b .
StaticLibrary : libswscale.a
StaticLibrary : libstdc++.a
SharedLibrary : libffmpeg.so
/home/sandhu/sunny/fplayj/obj/local/armeabi/objs/ffmpeg/ffplayAndroid.o:
In function `ffplayAndroid_setSurface':
/home/sandhu/sunny/fplayj/jni/jni/ffplayAndroid.cpp:414: undefined
reference to `__android_log_print'
/home/sandhu/sunny/fplayj/jni/jni/ffplayAndroid.cpp:417: undefined
reference to `__android_log_print'
/home/sandhu/sunny/fplayj/obj/local/armeabi/objs/ffmpeg/ffplayAndroid.o:
In function `ffplayAndroid_handleErrors':
/home/sandhu/sunny/fplayj/jni/jni/ffplayAndroid.cpp:90: undefined
reference to `__android_log_print'
/home/sandhu/sunny/fplayj/jni/jni/ffplayAndroid.cpp:70: undefined
reference to `__android_log_print'
/home/sandhu/sunny/fplayj/jni/jni/ffplayAndroid.cpp:74: undefined
reference to `__android_log_print'
/home/sandhu/sunny/fplayj/obj/local/armeabi/objs/ffmpeg/ffplayAndroid.o:/home/sandhu/sunny/fplayj/jni/jni/ffplayAndroid.cpp:78:
more undefined references to `__android_log_print' follow
collect2: ld returned 1 exit status
    &&
16:04 by &
切换到 branch froyo
    &&
16:06 by &
JollySandhu
Android.mk 的 LOCAL_LDLIBS 加入 -llog
    &&
16:12 by &
It is already in Android.mk ,my Android.mk as below
following and also added in #include
&android/log.h& in CPP files
OCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_CFLAGS := -D__STDC_CONSTANT_MACROS
LOCAL_C_INCLUDES += \
$(LOCAL_PATH)/../libffmpeg \
$(LOCAL_PATH)/../include
LOCAL_ARM_MODE := arm
LOCAL_SHARED_LIBRARIES := libffplay
LOCAL_STATIC_LIBRARIES := libavcodec libavformat libavutil
libswscale
#LOCAL_LDLIBS := -llog
LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llog
LOCAL_LDLIBS =
$(LOCAL_PATH)/../../obj/local/armeabi/libavcodec.a
LOCAL_LDLIBS +=
$(LOCAL_PATH)/../../obj/local/armeabi/libavformat.a
LOCAL_LDLIBS +=
$(LOCAL_PATH)/../../obj/local/armeabi/libavutil.a
LOCAL_LDLIBS +=
$(LOCAL_PATH)/../../obj/local/armeabi/libswscale.a
#LOCAL_LDLIBS +=
$(LOCAL_PATH)/../../obj/local/armeabi/libffplay.so
LOCAL_SRC_FILES := onLoad.cpp \
ffplayAndroid.cpp
LOCAL_MODULE := libffmpeg
include $(BUILD_SHARED_LIBRARY)
    &&
16:34 by &
@JollySandhu,动用最后的必杀技,在源码中把android_log_print()函数调用直接注射掉即可,也没几个地方。
    &&
23:30 by &
shaobin0604
请教为什么用M9播放视频文件一卡一卡的,也就是说中间有停顿
其他工程音视频直接输出JNI,也是要解码的吧,难道你用别的库解码音视频?
    &&
13:06 by &
@QQ,你用一个图像视频比较小低码流的文件测试看,如果还是很卡就说明M9改动太多,和Android2.2差别太大,大约要采用其他的技术来输出音视频。如果不卡就说明原来的测试视频太耗cpu了。
    &&
09:33 by &
很感谢博主提供的源码,已经在2.2模拟器上播放sd卡文件成功了。我现在想播放流媒体,直接修改的path参数,无法播放。想请问下博主:如何利用该解码库来解码流媒体呢?
    &&
16:45 by &
@wayneT,此demo为了简单,把网络相关的编译开关都关了。
修改config文件的编译开关,重新编译jni库,基本就可以了。
不过还是建议从ffmpeg原始压缩包中编译,我现在不记得代码中有没有把网络代码删掉。
不是很难的事情。
    &&
16:35 by &
楼主你好,我用你提供的代码来播放TS流文件,发现特别卡,一顿一顿的,请问可能是什么原因导致的?
    &&
16:09 by &
感谢回复。
有两个问题:
1.我下载了ffmpeg的原始包,如果要使用流媒体支持,配置脚本应该enable哪些?能否帮忙写一个?
2.ffmpeg代码精简怕删错东西,如果完全不删剪可以么会引起什么?
    &&
09:26 by &
@blueloading,最可能的原因是cpu内存什么的不够,跑不动导致的。TS流一般是MPEG2视频或者H264视频,MPEG2视频带宽大图像大,H264视频计算量大,都不是省油的灯。
    &&
09:39 by &
第一个问题,用UltraEdit之类的文本编辑器打开configure文件,大约在100行左右,有一个enable/disable列表,仔细看一
些,需要哪些开关就在命令行enable什么开关,然后在linux下configure,看回显的提示是否真正打开了开关,需要支持的
network,rtp什么的是否有显示。自己多试几次就可以了。
第二个问题,ffmpeg代码可以不删,本demo就没删,最多就是链接的时候
提示有些函数找不到,我已提供此问他的解决方案,就是在/jni/jni/Android.mk文件中添加 LOCAL_LDLIBS +=
C:/ffplay/bin/ndk/local/armeabi/libavcodec.a这一类的语句。
    &&
09:42 by &
我在模拟器上播放的效果也是一样的。播放过程会有以下Trace出来:
11-08 02:36:30.934: ERROR/FFMpegPlayerAndroid(314): AV_LOG_WARNING:
Sample rate index in program config element does not match the
sample rate index configured by the container.
11-08 02:36:31.254: ERROR/FFMpegPlayerAndroid(314): AV_LOG_ERROR:
Reserved bit set.
11-08 02:36:36.074: ERROR/FFMpegPlayerAndroid(314): AV_LOG_WARNING:
invalid dts/pts combination
11-08 02:36:36.084: ERROR/FFMpegPlayerAndroid(314): AV_LOG_ERROR:
number of reference frames exceeds max (probably corrupt input),
discarding one
11-08 02:36:36.134: DEBUG/FFMpegPlayerAndroid(314): no
11-08 02:36:36.134: ERROR/FFMpegPlayerAndroid(314): Frame
wasn't finished by video decoder
是不是解码过程有问题?
    &&
10:05 by &
@blueloading,这些Trace都是ffmpeg解码库里面的告警错误提示,是解码库的问题,原因有可能是码流里面的信息自相矛盾,也可能是码流里面有ffmpeg不支持的编码开关。
    &&
09:38 by &
第一个问题,用UltraEdit之类的文本编辑器打开configure文件,大约在100行左右,有一个enable/disable列表,仔细看一
些,需要哪些开关就在命令行enable什么开关,然后在linux下configure,看回显的提示是否真正打开了开关,需要支持的
network,rtp什么的是否有显示。自己多试几次就可以了。
第二个问题,ffmpeg代码可以不删,本demo就没删,最多就是链接的时候提示有些函数找不到,我已提供此问他的解决方案,就是在/jni/jni/Android.mk文件中添加
LOCAL_LDLIBS += C:/ffplay/bi...
mcodec你好,libffplay.so是封装好的,请问下其中的play方法能接收http流参数么?
    &&
10:32 by &
@ 精神邋遢的民工,
libffplay.so只是一个简单的音视频输出库,音频只接收PCM数据,视频只接收RGB565数据。常规情况下,http流数据应该解码后再调用
libffplay.so库输出,libffplay.so库和http什么的没有直接的关系,不接收http流参数。
    &&
16:18 by &
你好,我下载了
,导入工程后,运行视频文件后报错:No implementation found for native
Lcom/ffplay/ffplayA.native_avcodec_register_all ()V,请问这是什么原因
啊? libffmpeg.so和 libffplay.so 要自己生成吗?
    &&
18:46 by &
@zhangyuanjian,出现错误是因为你没有把.so文件打包进apk包。
libffplay.so文件不用自己生成,libffmpeg.so文件可以自己生成也可以从apk包中解压出来。
特别注意生成apk包时,libs子目录下是否有libffplay.so和libffmpeg.so文件。
    &&
10:00 by &
非常感谢博主,我的程序已经能够成功运行,“play,pause,stop,seek和视音频同步等功能实现代码,这部分代码不开源”,请问这些必须要自己去实现吗?
邮箱:(仅博主可见)
评论内容:
[使用Ctrl+Enter键快速提交评论]
最新IT新闻:
最新知识库文章:
Powered by:
Copyright & mcodec
阅读(12293)
<img src="/blog7style/images/common/sg_trans.gif" real_src ="/mcodec/aggbug/1780598.html?type=2&webview=1" ALT="" WIDTH="1px" HEIGHT="1px"
TITLE="基于ffmpeg的Android播放器开源代码&Posted&on&&11:40&mcodec&阅读(1964)&评论(68)&&编辑&收" />
H264解码器源码,移植ffmpeg中的H264解码部分到Android,深度删减优化,在模拟器(320x480)中验证通过。
程序的采用jni架构。界面部分,文件读取,视频显示都是用java做的,底层的视频解码用C来做满足速度的要求。
在这个版本中,从H264码流中分割出Nal是在java层做的,这样在java层直接调用解码时就知道是否有显示视频,缺点的就是耦合度/封装性差一点。
如果采用在底层做Nal分割的方法,可以封装得好看一些,但是每次送的数据有限制,如果送的数据太多,底层可能会一次解码出好几帧视频,但是通知到
界面层只能显示一帧,造成丢帧的现象。
如果每次送的数据较少,就会有很多次底层调用没有进行实质解码,很小气的做法,比如有一压缩数据帧需要600字节,如果一次送100个字节给解码器,那么
要送6次才会进行实质解码,因为每个数据帧有大有小,所以只能取极小值才不会导致丢帧。
不过所有的编码解码都是各种因素平衡折中的结果,具体用什么方法具体分析。
如果程序崩溃退出,优先考虑:
1)是否是baseline
2)byte [] NalBuf = new byte[40980]; 缓冲区是否溢出。
如果有B帧,那肯定不是baseline。
为便于支持不同分辨率的码流,修改了代码。现在只需要修改H264Android.java文件中第51,74,75行就可测试新分辨率。
有些大分辨率的码流可能会异常,优先修改H264Android.java文件中第161行把Nal缓冲区改大。
两版本都是用 android-ndk-1.6_r1-windows.zip 和 cygwin 1.7.5-1, gcc4
4.3.4-3 (用 cygcheck -c查看) 编译。
注意 /jni/H264Android.cpp文件添加了extern "C" 关键声明。
解码源码下载地址:&&
C++版本下载地址:
测试码流(240x320)下载地址:
测试码流(352x288)下载地址:
绿色通道:
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。}

我要回帖

更多关于 h.264播放器完整版 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信