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": {
"type": "markdown",
"state": {
"file": "03. 專注Study/Android/MediaCodec.md",
"file": "04. Programming/Kotlin/AtomicBoolean.md",
"mode": "source",
"source": true
}
@@ -130,7 +130,7 @@
"state": {
"type": "backlink",
"state": {
"file": "03. 專注Study/Android/MediaCodec.md",
"file": "04. Programming/Kotlin/AtomicBoolean.md",
"collapseAll": false,
"extraContext": false,
"sortOrder": "alphabetical",
@@ -166,7 +166,7 @@
"state": {
"type": "outline",
"state": {
"file": "03. 專注Study/Android/MediaCodec.md"
"file": "04. Programming/Kotlin/AtomicBoolean.md"
}
}
}
@@ -194,10 +194,10 @@
},
"active": "02d3631a7d6b4afa",
"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/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_flow.png",
"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())
## 使用
1. 根據需求使用createEncoderByType或是createDecoderByType建立codec。以下以encode為例。
2. 呼叫configure傳入相應的MediaFormat。
3. 呼叫start開始encode。
4. 建立一個迴圈不斷的傳入要encodebuffer也不斷的拿出已經encodebuffer。
5. 在迴圈內要傳入的buffer處理方法
1. 呼叫dequeueInputBuffer試探是否有能用的buffer如果有回傳值將大於等於0>= 0。這裡假設回傳值的變數叫做index。
2. 如果index合法`inputBuffer = queueInputBuffer(index)`來取得可用的buffer。這裡假設buffer的變數叫做inputBuffer。
3. 將要encode的資料copyinputBuffer。
1. 根據需求使用 [[#createEncoderByType]]或是 [[#createDecoderByType]] 建立codec。以下以 encode 為例。
2. 呼叫 [[#configure]],傳入相應的 MediaFormat。
3. 呼叫 [[#start]],開始 encode。
4. 建立一個迴圈,不斷的傳入要 encodebuffer也不斷的拿出已經 encodebuffer。
5. 在迴圈內,要傳入的 buffer 處理方法:
1. 呼叫 [[#dequeueInputBuffer]],試探是否有能用的 buffer如果有回傳值將大於等於0>= 0。這裡假設回傳值的變數叫做 index。
2. 如果 index 合法,用 [[#queueInputBuffer]],像是 `inputBuffer = queueInputBuffer(index)` 來取得可用的 buffer。這裡假設 buffer 的變數叫做 inputBuffer。
3. 將要 encode 的資料 copyinputBuffer。
4. 若要停止 encode送出 `codec.queueInputBuffer(inputBufIndex, 0, 0, 0, MediaCodec.BUFFER_FLAG_END_OF_STREAM)`
6. 在迴圈內要取得已經encode buffer的方法
1. 呼叫dequeueOutputBuffer試探是否有encoded buffer如果有回傳值將大於等於0>= 0。這裡假設回傳值的變數叫做index。
2. 如果index合法`outputBuffer = getOutputBuffer(index)`來取得可用的buffer。這裡假設buffer的變數叫做outputBuffer。
1. 呼叫 [[#dequeueOutputBuffer]],試探是否有 encoded buffer如果有回傳值將大於等於0>= 0。這裡假設回傳值的變數叫做 index。
2. 如果 index合法 [[#getOutputBuffer]],像是`outputBuffer = getOutputBuffer(index)` 來取得可用的 buffer。這裡假設 buffer 的變數叫做 outputBuffer。
3. outputBuffer 就是已經 encode 好的,就看你怎麼處理。
4. 重要!呼叫 releaseOutputBuffer 來回收剛剛那一塊 buffer。
4. 重要!呼叫 [[#releaseOutputBuffer]] 來回收剛剛那一塊 buffer。
Psuedo code 如下:
```kotlin
@@ -83,8 +84,11 @@ while (true)
// send buffer to encode
index = dequeueInputBuffer()
if (index >= 0)
if (!end)
inputBuffer = queueInputBuffer(index)
copy(inputBuffer, srcBuffer)
else
queueInputBuffer(inputBufIndex, 0, 0, 0, MediaCodec.BUFFER_FLAG_END_OF_STREAM)
// Get encoded buffer
index = dequeueOutputBuffer()
if (index >= 0)

View File

@@ -45,6 +45,8 @@ mutex.lock()
if (useable.get()) {
useable.set(false)
// Do something
} else {
...
}
mutex.unlock()
```