From c4cc3c553826a0ebfdc9ba508c2a7847fe0805c0 Mon Sep 17 00:00:00 2001 From: Awin Huang Date: Mon, 20 Mar 2023 09:52:39 +0800 Subject: [PATCH] vault backup: 2023-03-20 09:52:39 --- .obsidian/workspace.json | 12 +++++----- 03. 專注Study/Android/MediaCodec.md | 32 ++++++++++++++----------- 04. Programming/Kotlin/AtomicBoolean.md | 2 ++ 3 files changed, 26 insertions(+), 20 deletions(-) diff --git a/.obsidian/workspace.json b/.obsidian/workspace.json index 2a33f70..e6f4e16 100644 --- a/.obsidian/workspace.json +++ b/.obsidian/workspace.json @@ -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", diff --git a/03. 專注Study/Android/MediaCodec.md b/03. 專注Study/Android/MediaCodec.md index 15bfafa..fe9b85b 100644 --- a/03. 專注Study/Android/MediaCodec.md +++ b/03. 專注Study/Android/MediaCodec.md @@ -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. 建立一個迴圈,不斷的傳入要encode的buffer,也不斷的拿出已經encode的buffer。 -5. 在迴圈內,要傳入的buffer處理方法: - 1. 呼叫dequeueInputBuffer,試探是否有能用的buffer,如果有,回傳值將大於等於0(>= 0)。這裡假設回傳值的變數叫做index。 - 2. 如果index合法,用`inputBuffer = queueInputBuffer(index)`來取得可用的buffer。這裡假設buffer的變數叫做inputBuffer。 - 3. 將要encode的資料copy到inputBuffer。 +1. 根據需求使用 [[#createEncoderByType]]或是 [[#createDecoderByType]] 建立codec。以下以 encode 為例。 +2. 呼叫 [[#configure]],傳入相應的 MediaFormat。 +3. 呼叫 [[#start]],開始 encode。 +4. 建立一個迴圈,不斷的傳入要 encode 的 buffer,也不斷的拿出已經 encode 的 buffer。 +5. 在迴圈內,要傳入的 buffer 處理方法: + 1. 呼叫 [[#dequeueInputBuffer]],試探是否有能用的 buffer,如果有,回傳值將大於等於0(>= 0)。這裡假設回傳值的變數叫做 index。 + 2. 如果 index 合法,用 [[#queueInputBuffer]],像是 `inputBuffer = queueInputBuffer(index)` 來取得可用的 buffer。這裡假設 buffer 的變數叫做 inputBuffer。 + 3. 將要 encode 的資料 copy 到 inputBuffer。 + 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) - inputBuffer = queueInputBuffer(index) - copy(inputBuffer, srcBuffer) + 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) @@ -101,4 +105,4 @@ while (true) - [AndroidMediaCodecDemo/AudioDecoder.kt at main · king-ma1993/AndroidMediaCodecDemo](https://github.com/king-ma1993/AndroidMediaCodecDemo/blob/main/app/src/main/java/com/myl/mediacodedemo/decode/audio/AudioDecoder.kt) - [Android使用系统API进行音视频编码_key_max_input_size_blueberry_mu的博客-CSDN博客](https://blog.csdn.net/a992036795/article/details/54286654) - [MediaCodec 完成PCM编码成AAC - 知乎](https://zhuanlan.zhihu.com/p/564759685) -- [MediaCodec 同步方式完成AAC硬解成PCM - 知乎](https://zhuanlan.zhihu.com/p/564734700) \ No newline at end of file +- [MediaCodec 同步方式完成AAC硬解成PCM - 知乎](https://zhuanlan.zhihu.com/p/564734700) diff --git a/04. Programming/Kotlin/AtomicBoolean.md b/04. Programming/Kotlin/AtomicBoolean.md index ea0291e..59a3750 100644 --- a/04. Programming/Kotlin/AtomicBoolean.md +++ b/04. Programming/Kotlin/AtomicBoolean.md @@ -45,6 +45,8 @@ mutex.lock() if (useable.get()) { useable.set(false) // Do something +} else { + ... } mutex.unlock() ```