Chinaunix首页 | 论坛 | 博客
  • 博客访问: 308069
  • 博文数量: 78
  • 博客积分: 3635
  • 博客等级: 中校
  • 技术积分: 1115
  • 用 户 组: 普通用户
  • 注册时间: 2010-10-28 09:35
文章分类

全部博文(78)

文章存档

2011年(13)

2010年(65)

我的朋友

分类:

2010-12-17 09:58:37

把mplayer往android上移植有近二十天了,现在终于可以开始第二个阶段了,即把mplayer的音视频输出往Android的机制里面加。
    之前遇到好多问题,前面的过程大概分了三个小步骤:
    1.把mplayer本身在Android里面能够编译,生成mplayer。这步没有把mplayer里面ffmpeg的两个库libavcodec和libavformat加进去,因为开始还编译不过。这一步困难的地方在于有个函数在Android的glibc中没有,被裁减掉了。需要自己下载一份BSD的glibc,然后给它添加上。(Android的glibc从BSD裁减过来的。),等到把mplayer生成能运行了,开始再加ffmpeg部分,花了一个星期都没成,一堆的错误,屏幕上都显示不过来了...
    2.看来还是单独先移植下ffmpeg吧。这步生成几个库容易,但问题是链接生成ffmpeg程序麻烦了点,也改了下bionic,csdn上有个jl兄弟在blog上讲过在编译时遇到一些问题加#include ,但不知道他有没有用来生成可执行文件,还是只生成库就够了。要生成可执行文件,还是要改改bionic的。终于,在上周末ffmpeg生成了,能转视频格式了。
    3.既然mplayer本身已经可以了,ffmpeg也可以了,合起来就应该不怎么费事了。昨天很快就把mplayer下的ffmpeg的几个库加进去了,顺便再把libfaad和libmpeg2给加进去,在Android上一运行,音频设备打不开,情理之中的事了,Android给占用了。这就是下一大步的事了。视频给它在/dev下把graphics下的设备链一个到设备符fb0,居然能显示,只是一会有一会无,莫非是mplayer在和Android的surface打架吗?
    下面开始先把音频输出到Android的AudioFlinger上面去...

上周末把音频部分弄的差不多了,思路应当是对的,只是声音还没有出来。把Android的音频输出部分(audiooutput)用一个包装,变成能让c函数调用。大概样子像这样:
 extern "C" int mp_open(uint32_t sampleRate, int channelCount, int format, int flag)
 {
  printf("------c function in cpp----\n");
  MP_Audio_Output ao;
  return (int)ao.mp_cpp_open(sampleRate, channelCount, format, flag);
 } MP_Audio_Output继承自MediaPlayerInterface,自己在libao2下面添了个cpp文件。
    mplayer这边的接口改的是ao_oss.c文件,里面还差static float get_delay()这个函数没有实现,不能用它原来的,不是一回事。
    新的一堆事情来了,没功夫搞mplayer了,android上用mplayer只能等一等再弄了。
 
上次的时候,mplayer播放没有声音,其实音频差一点点就可以了的,前两天忙别的,今天把libmediaservice下的几个播放器看了看,对比发现少了start这个步骤,给mplayer里面添加上,很快就播放出声音了。。。不过奇怪的是get_delay()这个函数居然没有为难我。。。
    像上次说的那样,mplayer音频输出到ao_oss.c,从这里不用dsp的接口,而是通过c++转给c的接口,通过AudioOutput类调用AudioTrack,它再调用AudioSystem,最终调用AudioFlinger:
    mplayer解码  --> ao_oss.c --> c++/c接口 --> AudioOutput --> AudioTrack --> AudioSystem --> AudioFlinger
    下面再把视频输出往SurfaceFlinger上转过去,就算结束了。

好久没有看mplayer了,因为其他排了日程的事情。K先生非常着急,所以常常过来指导工作。甚至有一次晚上加班的时间,看到我在看mplayer,就严厉批评。后来还游击式的侦查过几次,从此以后,mplayer就很少看了...
    明天国庆,因为调休的原因,这周连续上班十天,也算创了记录。差不多到了第七天的时候,大伙看样子都支撑不住了,当然K先生也不例外,一副魂不守舍的样子,时常跑的不见踪影。
    好在部门里Z先生最近没要求大家提交软件版本,忙里偷闲,我就在第八天开始又研究起mplayer的视频显示问题,当然,也担心K先生会来指导工作,但实际的情况看来,这种担心显然有些多余了。
   
    之前讲过mplayer视频显示到surfaceflinger,opencore在解视频后的显示有个接口,android_surface_output.cpp,我看了看里面,我们的bsp给我们提供了overlay的接口,我就用这个接口了,打开overlay,config overlay,再就是copy数据到overlay,再就是关闭overlay,比较简单。但到今天能正常显示出来也用了两天多时间,功夫用在去理清mplayer视频解码后通过vf处理再用vo显示这一过程,以及接口间数据的匹配。
     当前还有很多没有做,例如对视频在显示前进行缩放,就要用到bsp中提供的多媒体库函数,它会由硬件进行相关的处理,如果不把它加进去而用软件缩放,如libswscale之类,就不用折腾了,结果不会好的。还有要命的一点问题是听说公司会用另外一个处理器,那现在折腾的这个就更不会有结果的。于是我就不想多用与处理器相关的东西了,还是等空暇的时候把mplayer做成像播放ogg那样的一个对象。移mplayer之前移过flac,所以还算知道其中的做法。
      因为mplayer移到android里面,即便是只到命令行能播放这一步,都还是有点麻烦的,过程也比较曲折,所以没有把每一步如何做都一一写下来,当时也是遇到问题再解决,再遇到,再解决,至于遇到过哪些问题,都记不清楚了,只有再遇到的时候,或许才能想起来。有朋友也给我站内发了消息,问我还有没有再移植。呵呵,谢谢关注啊,我还是会慢慢移植的,如果有朋友也在移植这个,我很高兴能认识啊,之前遇到难解的问题,也曾感到孤单。这这样的路上遇到,难道不是很亲切的吗?

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/houdiney/archive/2009/09/30/4623185.aspx
阅读(4006) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~