|
发表于 2021-12-30 10:20:56
3236 浏览 0 回复
RK平台播放框架切换
从5.1以后的sdk,rk平台上面可以同时支持ffmpeg以及stagefright(简称sf);
推荐使用ffmpeg
修改办法:
frameworks/av/media/libmediaplayerservice/Android.mk
BUILD_FF_PALYER := true ---设置为true时表示是ffmpeg框架
BUILD_FF_PALYER := false ---设置为flase时表示是sf框架
修改完这个宏以后需要用如下的命令编译:
mmm frameworks/av/media/libmediaplayerservice -B
编译接受后将编译好的libmediaplayerservice.so push到机器的system/lib下重启机器后再播放视频验证即可:
如果播放视频时候输出的log是:
D/RockFFPlayer( 150): enqueueMessage:sync wait ok
D/RockFFPlayer( 150): prepareAsync in
D/RockFFPlayerBase( 150): dumpStatus(): Initialized
D/RockFFPlayerBase( 150): dumpStatus(): Preparing
I/FFPlayer_Version( 150): rk30 board found in board property
I/FFPlayer_Version( 150): ******************************************
I/FFPlayer_Version( 150):
I/FFPlayer_Version( 150): starting main player: v2.0 2016-07-25:50:26.757499a3.fan
I/FFPlayer_Version( 150): ffPlayer is Built for BOARD_RK3288
I/FFPlayer_Version( 150):
关键字RockFFPlayer 或者ffPlayer is Built for 表示当前是ffmpeg框架
如果播放视频的时候 是:
输出AwesomePlayer::AwesomePlayer()in 则表示是sf框架;
如果修改后还是不生效,请仔细阅读文档,并检查自己的编译步骤,以及push的so是否正确;
注意:
不建议修改默认框架,毕竟ffmpeg要比sf框架适用范围广泛,但是如果通过框架切换可以解决问题,那么
可以使用下面的方法去修改;指定符合某些条件的才去切换
frameworks\av\media\libmediaplayerservice\MediaPlayerFactory.cpp
player_type MediaPlayerFactory::getPlayerType(const sp<IMediaPlayer>& client,const char* url)
{
if(!strcmp(sCallingProcessName.c_str(),"android.media.cts") ||
!strcmp(sCallingProcessName.c_str(),"android.mediastress.cts") ||
!strcmp(sCallingProcessName.c_str(),"android.security.cts"))
return NU_PLAYER;----6.0以后的sdk返回这个,如果是5.1返回的是STAGEFRIGHT_PLAYER
... ...
}
或者是
player_type MediaPlayerFactory::getPlayerType(const sp<IMediaPlayer>& client,int fd,int64_t offset,int64_t length)
{
#ifdef USE_FFPLAYER
String8 filePath;
getFileName(fd,&filePath);
if(strstr(filePath.string(),".ogg")){----表示ogg格式的文件调用sf框架的播放器
return NU_PLAYER;----6.0以后的sdk返回这个,如果是5.1返回的是STAGEFRIGHT_PLAYER
}
... ...
}
|
|
|
|
|
|
|
登录或注册
|