Media 錄音和播放 簡要筆記(一)

MediaRecorder的狀態







MediaRecorder的錄音過程


首先:frameworks/base/media/java/android/media/MediaRecorder.java

publicnative void start() throws IllegalStateException;


接着到JNI

frameworks/base/media/jni/android_media_MediaRecorder.cpp


340android_media_MediaRecorder_start(JNIEnv *env, jobject thiz)

341{

342 //LOGV("start");

343 sp<MediaRecorder> mr = getMediaRecorder(env, thiz);

344 process_media_recorder_call(env, mr->start(),"java/lang/RuntimeException", "start failed.");

345}


接着到libmedia中:

frameworks/base/media/libmedia/mediarecorder.cpp

調用tatus_tret = mMediaRecorder->start(); 其中mMediaRecorderIMediaRecorder.cpp


備註:

classIMediaRecorder: public Iinterface

classBnMediaRecorder: public BnInterface<IMediaRecorder>

classMediaRecorderClient : public BnMediaRecorder


接着到IMediaRecorder.cpp中:

./libmedia/IMediaRecorder.cpp

221 status_t start()

222 {

223 LOGV("start");

224 Parcel data, reply;

225 data.writeInterfaceToken(IMediaRecorder::getInterfaceDescriptor());

226 remote()->transact(START, data, &reply);

227 return reply.readInt32();

228 }


接着到frameworks/base/media/libmediaplayerservice/MediaRecorderClient.cpp

222status_t MediaRecorderClient::start()

223{

224 LOGV("start");

225 Mutex::Autolock lock(mLock);

226 if (mRecorder == NULL) {

227 LOGE("recorder is not initialized");

228 return NO_INIT;

229 }

230 return mRecorder->start();

231

232}

備註:MediaRecorderBase *mRecorder;

structStagefrightRecorder : public MediaRecorderBase


接着到frameworks/base/media/libmediaplayerservice/StagefrightRecorder.cpp

146status_t StagefrightRecorder::start() {

147 if (mWriter != NULL) {

148 return UNKNOWN_ERROR;

149 }

150

151 switch (mOutputFormat) {

152 case OUTPUT_FORMAT_DEFAULT:

153 case OUTPUT_FORMAT_THREE_GPP:

154 case OUTPUT_FORMAT_MPEG_4:

155 return startMPEG4Recording();

156

157 case OUTPUT_FORMAT_AMR_NB:

158 case OUTPUT_FORMAT_AMR_WB:

159 return startAMRRecording();

160

161 default:

162 return UNKNOWN_ERROR;

163 }

164}






MediaPlayer的播放過程

首先:

frameworks/base/media/java/android/media/MediaPlayer.java

部分代碼:

796 public void start() throws IllegalStateException {

797 stayAwake(true);

798 _start();

799 }

privatenative void _start() throws IllegalStateException;


接着到:frameworks/base/media/jni/android_media_MediaPlayer.cpp

348android_media_MediaPlayer_start(JNIEnv *env, jobject thiz)

349{

350 //LOGV("start");

351 sp<MediaPlayer> mp = getMediaPlayer(env, thiz);

352 if (mp == NULL ) {

353 jniThrowException(env, "java/lang/IllegalStateException",NULL);

354 return;

355 }

356 process_media_player_call( env, thiz, mp->start(), NULL, NULL);

357}


接着到:frameworks/base/media/libmedia/mediaplayer.cpp


262status_t MediaPlayer::start()

263{

264 LOGV("start");

265 Mutex::Autolock _l(mLock);

266 if (mCurrentState & MEDIA_PLAYER_STARTED)

267 return NO_ERROR;

268 if ( (mPlayer != 0) && ( mCurrentState & (MEDIA_PLAYER_PREPARED |

269 MEDIA_PLAYER_PLAYBACK_COMPLETE |MEDIA_PLAYER_PAUSED ) ) ) {

270 mPlayer->setLooping(mLoop);

271 mPlayer->setVolume(mLeftVolume, mRightVolume);

272 mCurrentState = MEDIA_PLAYER_STARTED;

273 status_t ret =mPlayer->start();

274 if (ret != NO_ERROR) {

275 mCurrentState = MEDIA_PLAYER_STATE_ERROR;

276 } else {

277 if (mCurrentState == MEDIA_PLAYER_PLAYBACK_COMPLETE) {

278 LOGV("playback completed immediately followingstart()");

279 }

280 }

281 return ret;

282 }

283 LOGE("start called in state %d", mCurrentState);

284 return INVALID_OPERATION;

285}

286


備註:sp<IMediaPlayer> mPlayer;

classBnMediaPlayer: public BnInterface<IMediaPlayer>

classClient : public BnMediaPlayer


接着:frameworks/base/media/libmediaplayerservice/MediaPlayerService.cpp


1094status_t MediaPlayerService::Client::start()

1095{

1096 LOGV("[%d] start", mConnId);

1097 sp<MediaPlayerBase> p = getPlayer();

1098 if (p == 0) return UNKNOWN_ERROR;

1099 p->setLooping(mLoop);

1100 return p->start();

1101}


備註:

classMediaPlayerBase : public RefBase

classMediaPlayerInterface : public MediaPlayerBase

classPVPlayer : public MediaPlayerInterface

classOMXPlayer : public MediaPlayerInterface


1.首先,錄音機操作需要相關權限,比如:

<uses-permissionandroid:name="android.permission.RECORD_AUDIO"/>

<uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

2.錄音機開始錄音

如下:判斷擴展卡狀態,重要類Environment

publicstaticbooleanexternalStorageExist() {

StringgetExternalStorageState = Environment.getExternalStorageState();

if(getExternalStorageState.equals(Environment.MEDIA_MOUNTED)){

returntrue;

}

returnfalse;

}




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章