MediaPlayer基本使用方式:播放一首MP3歌曲
MediaPlayer mp = new MediaPlayer();
mp.setDataSource("/sdcard/test.mp3");
mp.prepare();
mp.start();//这里初始化CCDeCoder解码器
1. IMediaPlayer.cpp/h
<1>.头文件
frameworks/av/include/media/IMediaPlayer.h
#include <utils/RefBase.h>
#include <binder/IInterface.h>
#include <binder/Parcel.h>
class IMediaPlayer: public IInterface{
public:
//使用宏,申明MediaPlayer ——> IMediaPlayer
DECLARE_META_INTERFACE(MediaPlayer);
//声明setDataSource()纯虚方法
virtual status_t setDataSource(const sp<IDataSource>& source) = 0;
virtual status_t setDataSource(const sp<IMediaHTTPService> &httpService, const char *url, const KeyedVector<String8, String8>* headers) = 0;
virtual status_t setDataSource(int fd, int64_t offset, int64_t length) = 0;
virtual status_t setDataSource(const sp<IStreamSource>& source) = 0;
};
//声明一下服务端BnMediaPlayer
class BnMediaPlayer: public BnInterface<IMediaPlayer>{
public:
virtual status_t onTransact( uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags = 0);
}
<2>.源文件
frameworks/av/media/libmedia/IMediaPlayer.cpp
class BpMediaPlayer: public BpInterface<IMediaPlayer>{
public:
//BpMediaPlayer代理客户端初始化
BpMediaPlayer(const sp<IBinder>& impl) : BpInterface<IMediaPlayer>(impl){
}
//实现客户端setDataSource方法
status_t setDataSource(const sp<IStreamSource> &source) {
Parcel data, reply;
data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
data.writeStrongBinder(IInterface::asBinder(source));
//发送SET_DATA_SOURCE_STREAM命令在Bn端远程调用setDataSource()方法
remote()->transact(SET_DATA_SOURCE_STREAM, data, &reply);
//客户端通过reply.readInt32()方法返回Bn远程端返回的数据,返回给java应用层使用
return reply.readInt32();
}
//利用Binder引用远程调用setDataSource()方法
IMPLEMENT_META_INTERFACE(MediaPlayer, "android.media.IMediaPlayer”);
//服务端,接收远程消息,处理onTransact方法
status_t BnMediaPlayer::onTransact(uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags){
switch (code) {
//收到SET_DATA_SOURCE_STREAM命令的处理流程
case SET_DATA_SOURCE_STREAM:{
CHECK_INTERFACE(IMediaPlayer, data, reply);
sp<IStreamSource> source = interface_cast<IStreamSource>(data.readStrongBinder());
if (source == NULL) {
reply->writeInt32(BAD_VALUE);
}else {
//调用BN服务端实现的setDataSource()方法,然后通过reply->writeInt32(setDataSource(source))返回给客户端
reply->writeInt32(setDataSource(source));
}
return NO_ERROR;
}
}
}
}
2. MediaPlayerService.cpp/h
<1>.头文件
frameworks/av/media/libmediaplayerservice/MediaPlayerService.h
#include <media/MediaPlayerInterface.h>
class MediaPlayerService : public BnMediaPlayerService{
private:
//因为Client类继承了BnMediaPlayer远程的服务端
class Client : public BnMediaPlayer {
//BnMediaPlayer端的setDataSource()方法实现在这里
virtual status_t setDataSource(const sp<IStreamSource> &source);
};
};
<2>.源文件
frameworks/av/media/libmediaplayerservice/MediaPlayerService.cpp
第一:
MediaPlayerService::Client::Client(const sp<MediaPlayerService>& service, pid_t pid, int32_t connId,
const sp<IMediaPlayerClient>& client, audio_session_t audioSessionId, uid_t uid){
//Client类初始化
}
第二:
//Bn服务端执行的setDataSource()方法:这里就是Client类继承了BnMediaPlayer远程的服务端真正执行
status_t MediaPlayerService::Client::setDataSource(const sp<IStreamSource> &source) {
player_type playerType = MediaPlayerFactory::getPlayerType(this, source);
sp<MediaPlayerBase> p = setDataSource_pre(playerType);
if(p == NULL) {
return NO_INIT;
}
// now set data source
//这里的setDataSource()最终调用第七步NuPlayerDriver.cpp中的status_t NuPlayerDriver::setDataSource()
setDataSource_post(p, p->setDataSource(source));
return mStatus;
}
NuPlayerDriver.cpp
————>setDataSource(){mPlayer->setDataSourceAsync(httpService, url, headers);}
NuPlayer.cpp
—————> setDataSourceAsync(){
//发送命令kWhatSetDataSource和返回命令kWhatSourceNotify消息命令
sp<AMessage> msg = new AMessage(kWhatSetDataSource, this);
sp<AMessage> notify = new AMessage(kWhatSourceNotify, this);
msg->setObject("source", new StreamingSource(notify, source));
msg->post();
}
—————>onMessageReceive(){
switch (msg->what()) {
case kWhatSetDataSource:{
status_t err = OK;//OK = 0;
sp<RefBase> obj;
mSource = static_cast<Source *>(obj.get());
//把弱指针提升为强指针:定义在:NuPlayer.h: wp<NuPlayerDriver> mDriver;
sp<NuPlayerDriver> driver = mDriver.promote();
if (driver != NULL)
driver->notifySetDataSourceCompleted(err);
}
}
}
————————->frameworks/av/media/libmediaplayerservice/nuplayer/StreamingSource.cpp
NuPlayer::StreamingSource::StreamingSource(const sp<AMessage> ¬ify, const sp<IStreamSource> &source): Source(notify), mSource(source{
}
————————>void NuPlayer::StreamingSource::start(){
mStreamListener = new NuPlayerStreamListener(mSource, NULL);
mTSParser = new ATSParser(parserFlags);
mStreamListener->start();
postReadBuffer();
}
——————————>status_t NuPlayer::StreamingSource::postReadBuffer() {
(new AMessage(kWhatReadBuffer, this))->post();//发送kWhatReadBuffer命令
}
———————>void NuPlayer::StreamingSource::onMessageReceived(){
case kWhatReadBuffer:
onReadBuffer();
}
———————>void NuPlayer::StreamingSource::onReadBuffer() {
for (int32_t i = 0; i < kNumListenerQueuePackets; ++i) { //for循环不停的读数据
ssize_t n = mStreamListener->read(buffer, sizeof(buffer), &extra);
status_t err = mTSParser->feedTSPacket(buffer, sizeof(buffer));
}
}
—————————>frameworks/av/media/libstagefright/mpeg2ts/ATSParser.cpp
status_t ATSParser::feedTSPacket(){
ABitReader br((const uint8_t *)data, kTSPacketSize);
return parseTS(&br, event);
}
第三:
sp<MediaPlayerBase> MediaPlayerService::Client::setDataSource_pre(player_type playerType){
sp<MediaPlayerBase> p = createPlayer(playerType);
if(p == NULL)
return p;
}
第四:
sp<MediaPlayerBase> MediaPlayerService::Client::createPlayer(player_type playerType){
sp<MediaPlayerBase> p = getPlayer();
if ((p != NULL) && (p->playerType() != playerType)) {
p.clear();
}
if (p == NULL) {
p = MediaPlayerFactory::createPlayer(playerType, this, notify, mPid);
}
return p;
}
第五:
frameworks/av/media/libmediaplayerservice/MediaPlayerFactory.cpp
#include "nuplayer/NuPlayerDriver.h"
sp<MediaPlayerBase> MediaPlayerFactory::createPlayer(player_type playerType, void* cookie, notify_callback_f notifyFunc, pid_t pid) {
sp<MediaPlayerBase> p;
factory = sFactoryMap.valueFor(playerType);
p = factory->createPlayer(pid);
if (p == NULL) {
return p;
}
}
第六:
class NuPlayerFactory : public MediaPlayerFactory::IFactory {
public:
virtual sp<MediaPlayerBase> createPlayer(pid_t pid) {
ALOGV(" create NuPlayer");
//在NuPlayerDriver实现创建播放器方法createPlayer()
return new NuPlayerDriver(pid);
}
};
第七:
frameworks/av/media/libmediaplayerservice/nuplayer/NuPlayerDriver.cpp
NuPlayerDriver::NuPlayerDriver(pid_t pid) : mState(STATE_IDLE), mIsAsyncPrepare(false), mAsyncResult(UNKNOWN_ERROR), mSetSurfaceInProgress(false), ….){
ALOGV("NuPlayerDriver(%p)", this);
mLooper->setName("NuPlayerDriver Looper");
mLooper->start(false, /* runOnCallingThread */ true, /* canCallJava */ PRIORITY_AUDIO);
//在这里创建播放器
mPlayer = AVNuFactory::get()->createNuPlayer(pid);
mLooper->registerHandler(mPlayer);
mPlayer->setDriver(this);
}
第八:
frameworks/av/media/libavextensions/mediaplayerservice/AVNuFactory.cpp
sp<NuPlayer> AVNuFactory::createNuPlayer(pid_t pid) {
return new NuPlayer(pid);
}
第九:
frameworks/av/media/libmediaplayerservice/nuplayer/NuPlayer.cpp
NuPlayer::NuPlayer(pid_t pid) : mUIDValid(false), mPID(pid), mPausedForBuffering(false) {
clearFlushComplete();
}
3.mediaplayer.cpp/h
<1>.头文件
frameworks/av/include/media/mediaplayer.h
#include <media/IMediaPlayerClient.h>
#include <media/IMediaPlayer.h>
#include <media/IMediaDeathNotifier.h>
class MediaPlayer : public BnMediaPlayerClient, public virtual IMediaDeathNotifier{
public:
MediaPlayer();
~MediaPlayer();
virtual status_t setDataSource(const sp<IMediaHTTPService> &httpService, const char *url, const KeyedVector<String8, String8> *headers);
status_t setDataSource(int fd, int64_t offset, int64_t length);
status_t setDataSource(const sp<IDataSource> &source);
};
<2>.源文件
frameworks/av/media/libmedia/mediaplayer.cpp
status_t MediaPlayer::setDataSource(const sp<IDataSource> &source){
ALOGV("setDataSource(IDataSource)");
status_t err = UNKNOWN_ERROR;
const sp<IMediaPlayerService> service(getMediaPlayerService());
if(service != 0) {
sp<IMediaPlayer> player(service->create(this, mAudioSessionId));
if((NO_ERROR != doSetRetransmitEndpoint(player)) || (NO_ERROR != player->setDataSource(source))) {
player.clear();
}
err = attachNewPlayer(player)
}
return err;
}
4. IMediaPlayerService.cpp/h
<1>.头文件
frameworks/av/include/media/IMediaPlayerService.h
#include <utils/RefBase.h>
#include <binder/IInterface.h>
#include <binder/Parcel.h>
#include <media/IMediaPlayerClient.h>
#include <media/IMediaPlayer.h>
class IMediaPlayerService: public IInterface{
public:
DECLARE_META_INTERFACE(MediaPlayerService);//使用宏,申明MediaPlayer ——> IMediaPlayer
virtual sp<IMediaPlayer> create(const sp<IMediaPlayerClient>& client,audio_session_t audioSessionId = AUDIO_SESSION_ALLOCATE) = 0;
};
<2>.源文件
frameworks/av/media/libmedia/IMediaPlayerService.cpp
virtual sp<IMediaPlayer> create(const sp<IMediaPlayerClient>& client, audio_session_t audioSessionId){
Parcel data, reply;
data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
data.writeStrongBinder(IInterface::asBinder(client));
data.writeInt32(audioSessionId);
remote()->transact(CREATE, data, &reply);
return interface_cast<IMediaPlayer>(reply.readStrongBinder());
}