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;

}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值