針對android錄影編寫測試程序

目前需要嘗試不使用android的camera架構來做一個錄像和預覽的功能。思路是利用libstagefrigt來調用OMX實現錄像功能。在實做中發現自己寫的私有MediaSource有個BUG,這裏記錄下。

這個私有MediaSource可以正常錄像,但是最後一幀會crash:

status_t RecordSource::read(MediaBuffer **buffer, const MediaSource::ReadOptions *options) {
	status_t err = mGroup.acquire_buffer(buffer);
	if (err != OK) {
		return err;
	}

	if (mRecordNum == mMaxNumFrames) {
		return ERROR_END_OF_STREAM;
	}
	

這麼做的問題是在mGroup已經申請了MediaBuffer,這樣會調用addRef, 而只有read函數返回正常纔會在OMXCodec::drainInputBuffer裏去release這個buffer。

而像這裏的寫法,read返回的是一個err status, 這會導致buffer已經申請但是沒有釋放,在沒有釋放的時候又要去結束這段record,自然就有問題。 Android在MediaBuffer的

管理上運用了引用計數,會在析構這個MediaBuffer的時候運用CHECK_EQ來檢查是否這個計數已經爲零,既是否所有被申請的buffer已經被使用完成並釋放。


這個錯誤耽誤了進度兩個多小時,在此記錄,引以爲戒。

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