vault backup: 2023-03-20 09:52:39

This commit is contained in:
2023-03-20 09:52:39 +08:00
parent b1f5dea040
commit c4cc3c5538
3 changed files with 26 additions and 20 deletions

View File

@@ -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",

View File

@@ -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)

View File

@@ -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()
``` ```