vault backup: 2023-03-20 09:52:39
This commit is contained in:
12
.obsidian/workspace.json
vendored
12
.obsidian/workspace.json
vendored
@@ -65,7 +65,7 @@
|
|||||||
"state": {
|
"state": {
|
||||||
"type": "markdown",
|
"type": "markdown",
|
||||||
"state": {
|
"state": {
|
||||||
"file": "03. 專注Study/Android/MediaCodec.md",
|
"file": "04. Programming/Kotlin/AtomicBoolean.md",
|
||||||
"mode": "source",
|
"mode": "source",
|
||||||
"source": true
|
"source": true
|
||||||
}
|
}
|
||||||
@@ -130,7 +130,7 @@
|
|||||||
"state": {
|
"state": {
|
||||||
"type": "backlink",
|
"type": "backlink",
|
||||||
"state": {
|
"state": {
|
||||||
"file": "03. 專注Study/Android/MediaCodec.md",
|
"file": "04. Programming/Kotlin/AtomicBoolean.md",
|
||||||
"collapseAll": false,
|
"collapseAll": false,
|
||||||
"extraContext": false,
|
"extraContext": false,
|
||||||
"sortOrder": "alphabetical",
|
"sortOrder": "alphabetical",
|
||||||
@@ -166,7 +166,7 @@
|
|||||||
"state": {
|
"state": {
|
||||||
"type": "outline",
|
"type": "outline",
|
||||||
"state": {
|
"state": {
|
||||||
"file": "03. 專注Study/Android/MediaCodec.md"
|
"file": "04. Programming/Kotlin/AtomicBoolean.md"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -194,10 +194,10 @@
|
|||||||
},
|
},
|
||||||
"active": "02d3631a7d6b4afa",
|
"active": "02d3631a7d6b4afa",
|
||||||
"lastOpenFiles": [
|
"lastOpenFiles": [
|
||||||
"03. 專注Study/Android/Android External Storage - Read, Write, Save File.md",
|
|
||||||
"03. 專注Study/Android/Android programming.md",
|
|
||||||
"03. 專注Study/Android/ADB 取得 APK 的 icon.md",
|
|
||||||
"03. 專注Study/Android/MediaCodec.md",
|
"03. 專注Study/Android/MediaCodec.md",
|
||||||
|
"03. 專注Study/Android/Android programming.md",
|
||||||
|
"03. 專注Study/Android/Android External Storage - Read, Write, Save File.md",
|
||||||
|
"03. 專注Study/Android/ADB 取得 APK 的 icon.md",
|
||||||
"attachments/android_mediacodec_life_cycle.png",
|
"attachments/android_mediacodec_life_cycle.png",
|
||||||
"attachments/android_mediacodec_flow.png",
|
"attachments/android_mediacodec_flow.png",
|
||||||
"04. Programming/Kotlin/AtomicBoolean.md",
|
"04. Programming/Kotlin/AtomicBoolean.md",
|
||||||
|
|||||||
@@ -63,19 +63,20 @@ MediaCodec的生命週期有三種狀態:Stopped、Executing、Released。
|
|||||||
- [release](https://developer.android.com/reference/android/media/MediaCodec#release())
|
- [release](https://developer.android.com/reference/android/media/MediaCodec#release())
|
||||||
|
|
||||||
## 使用
|
## 使用
|
||||||
1. 根據需求使用createEncoderByType或是createDecoderByType建立codec。以下以encode為例。
|
1. 根據需求使用 [[#createEncoderByType]]或是 [[#createDecoderByType]] 建立codec。以下以 encode 為例。
|
||||||
2. 呼叫configure,傳入相應的MediaFormat。
|
2. 呼叫 [[#configure]],傳入相應的 MediaFormat。
|
||||||
3. 呼叫start,開始encode。
|
3. 呼叫 [[#start]],開始 encode。
|
||||||
4. 建立一個迴圈,不斷的傳入要 encode 的 buffer,也不斷的拿出已經 encode 的 buffer。
|
4. 建立一個迴圈,不斷的傳入要 encode 的 buffer,也不斷的拿出已經 encode 的 buffer。
|
||||||
5. 在迴圈內,要傳入的 buffer 處理方法:
|
5. 在迴圈內,要傳入的 buffer 處理方法:
|
||||||
1. 呼叫dequeueInputBuffer,試探是否有能用的buffer,如果有,回傳值將大於等於0(>= 0)。這裡假設回傳值的變數叫做index。
|
1. 呼叫 [[#dequeueInputBuffer]],試探是否有能用的 buffer,如果有,回傳值將大於等於0(>= 0)。這裡假設回傳值的變數叫做 index。
|
||||||
2. 如果index合法,用`inputBuffer = queueInputBuffer(index)`來取得可用的buffer。這裡假設buffer的變數叫做inputBuffer。
|
2. 如果 index 合法,用 [[#queueInputBuffer]],像是 `inputBuffer = queueInputBuffer(index)` 來取得可用的 buffer。這裡假設 buffer 的變數叫做 inputBuffer。
|
||||||
3. 將要 encode 的資料 copy 到 inputBuffer。
|
3. 將要 encode 的資料 copy 到 inputBuffer。
|
||||||
|
4. 若要停止 encode,送出 `codec.queueInputBuffer(inputBufIndex, 0, 0, 0, MediaCodec.BUFFER_FLAG_END_OF_STREAM)`。
|
||||||
6. 在迴圈內,要取得已經encode buffer的方法:
|
6. 在迴圈內,要取得已經encode buffer的方法:
|
||||||
1. 呼叫dequeueOutputBuffer,試探是否有encoded buffer,如果有,回傳值將大於等於0(>= 0)。這裡假設回傳值的變數叫做index。
|
1. 呼叫 [[#dequeueOutputBuffer]],試探是否有 encoded buffer,如果有,回傳值將大於等於0(>= 0)。這裡假設回傳值的變數叫做 index。
|
||||||
2. 如果index合法,用`outputBuffer = getOutputBuffer(index)`來取得可用的buffer。這裡假設buffer的變數叫做outputBuffer。
|
2. 如果 index合法,用 [[#getOutputBuffer]],像是`outputBuffer = getOutputBuffer(index)` 來取得可用的 buffer。這裡假設 buffer 的變數叫做 outputBuffer。
|
||||||
3. outputBuffer 就是已經 encode 好的,就看你怎麼處理。
|
3. outputBuffer 就是已經 encode 好的,就看你怎麼處理。
|
||||||
4. 重要!呼叫 releaseOutputBuffer 來回收剛剛那一塊 buffer。
|
4. 重要!呼叫 [[#releaseOutputBuffer]] 來回收剛剛那一塊 buffer。
|
||||||
|
|
||||||
Psuedo code 如下:
|
Psuedo code 如下:
|
||||||
```kotlin
|
```kotlin
|
||||||
@@ -83,8 +84,11 @@ while (true)
|
|||||||
// send buffer to encode
|
// send buffer to encode
|
||||||
index = dequeueInputBuffer()
|
index = dequeueInputBuffer()
|
||||||
if (index >= 0)
|
if (index >= 0)
|
||||||
|
if (!end)
|
||||||
inputBuffer = queueInputBuffer(index)
|
inputBuffer = queueInputBuffer(index)
|
||||||
copy(inputBuffer, srcBuffer)
|
copy(inputBuffer, srcBuffer)
|
||||||
|
else
|
||||||
|
queueInputBuffer(inputBufIndex, 0, 0, 0, MediaCodec.BUFFER_FLAG_END_OF_STREAM)
|
||||||
// Get encoded buffer
|
// Get encoded buffer
|
||||||
index = dequeueOutputBuffer()
|
index = dequeueOutputBuffer()
|
||||||
if (index >= 0)
|
if (index >= 0)
|
||||||
|
|||||||
@@ -45,6 +45,8 @@ mutex.lock()
|
|||||||
if (useable.get()) {
|
if (useable.get()) {
|
||||||
useable.set(false)
|
useable.set(false)
|
||||||
// Do something
|
// Do something
|
||||||
|
} else {
|
||||||
|
...
|
||||||
}
|
}
|
||||||
mutex.unlock()
|
mutex.unlock()
|
||||||
```
|
```
|
||||||
|
|||||||
Reference in New Issue
Block a user