国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Android 音視頻入門 (四)- 記錄一次MediaCodec ,天吶

這篇具有很好參考價值的文章主要介紹了Android 音視頻入門 (四)- 記錄一次MediaCodec ,天吶。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

isEncoding = true //開始編碼
mMediaCodec.start() //構(gòu)建連接器。
mWorkerThread = HandlerThread(“WorkerThread-Encoder”)
mWorkerThread.start()
mHandler = Handler(mWorkerThread.looper)
}

注意,我們并不在此處就開啟Muxer,我們會在子線程中接受數(shù)據(jù)的時候的某個狀態(tài)開始進(jìn)行混合。

mCameraDevice.setPreviewCallback { data, camera ->
if (::mHandler.isInitialized) {
mHandler.post {
//把橫版視頻分辨率:1920 * 1080 轉(zhuǎn)換成豎版: 1080 * 1920
val verticalData = ImageFormatUtils.rotateYUV420Degree90(data, mPreviewSize.height, mPreviewSize.width)
onFrameAvailable(verticalData)
}
}
}

我在查詢Camera支持的分辨率的時候,發(fā)現(xiàn)所有的分辨率都是橫版的分辨率,即:1920*1080版本的,但是我們MediaCodec最初設(shè)定的分辨率是豎版的,這里也是一個坑。

onFrameAvailable()方法中,我們不斷地插入一個byte數(shù)組,這個數(shù)組中是相機(jī)實時傳來的預(yù)覽畫面,我們對這個畫面進(jìn)行編碼即可。編碼完成后,將編碼出來的畫面接入到Muxer中:

private fun onFrameAvailable(_data: ByteArray?) {
if (!isEncoding) {
return;
}
//(可選NV21->I420),然后送入解碼器
val data: ByteArray = _data!!

var index = 0
try {
index = mMediaCodec.dequeueInputBuffer(0)
} catch (e: Exception) {
e.printStackTrace()
return
}
if (index >= 0) {
val inputBuffer = mMediaCodec.getInputBuffer(index)
inputBuffer!!.clear()
inputBuffer.put(data, 0, data.size)
mMediaCodec.queueInputBuffer(
index,
0,
data.size,
System.nanoTime() / 1000,
0)
}
while (true) {
val bufferInfo = MediaCodec.BufferInfo()
val encoderStatus = mMediaCodec.dequeueOutputBuffer(bufferInfo, 10_000)
if (encoderStatus == MediaCodec.INFO_TRY_AGAIN_LATER) {
break//稍后再試
} else if (encoderStatus == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED) {
//輸出的格式發(fā)生了改變,此處開啟混合器
val newFormat = mMediaCodec.outputFormat
mVideoTrack = mMuxer!!.addTrack(newFormat)
mMuxer!!.start()
} else if (encoderStatus == MediaCodec.INFO_OUTPUT_BUFFERS_CHANGED) {
//
} else {
//正常編碼則獲得緩沖區(qū)下標(biāo)
val encodedDat = mMediaCodec.getOutputBuffer(encoderStatus)
if ((bufferInfo.flags and MediaCodec.BUFFER_FLAG_CODEC_CONFIG) != 0) {
bufferInfo.size = 0
}
if (bufferInfo.size != 0) {
//設(shè)置從XX地方開始讀取數(shù)據(jù)
encodedDat!!.position(bufferInfo.offset)
//設(shè)置讀數(shù)據(jù)總長度
encodedDat.limit(bufferInfo.offset + bufferInfo.size)
//寫出MP4
if (!isEncoding) {
return
}
mMuxer!!.writeSampleData(mVideoTrack, encodedDat, bufferInfo)

}
//釋放緩沖區(qū)
mMediaCodec.releaseOutputBuffer(encoderStatus, false)
}
}
}

這個方法是在子線程中執(zhí)行的。

七. 生成文件

private fun pauseRecord() {
+send//顯示發(fā)送按鈕
record.isRunning = false
Timer.cancel()//取消計時
showBackOrCancel()
if (isEncoding) {
stopEncoder()
}
}

private fun stopEncoder() {
isEncoding = false
Toast(this.obbDir.absolutePath + “\下”)
try {
mMuxer?.stop()
mMuxer?.release()
//停止
mMediaCodec.stop()
mMediaCodec.release()
} catch (e: Exception) {
e.printStackTrace()
}
}

這樣一來,我們在存儲目錄中的Android/obb/包名/下就有生成的文件了。

八. 總結(jié)

總體來說還是挺簡陋的,比如沒有根據(jù)具體的設(shè)備動態(tài)地去判斷錄制的尺寸、錄制的色彩格式選擇等等,相機(jī)相關(guān)的功能閃光燈、對焦也未加入。

MediaCodec本身是編解碼器,和FFmpeg不同,它會優(yōu)先進(jìn)行硬件解碼,效率高,功耗低,但是缺點就是,兼容性、可擴(kuò)展性相對于軟件解碼來說會更低。有一部分的播放軟件,將硬解還是軟解的選擇權(quán)交給了用戶,這樣既可以兼顧到擴(kuò)展性,又可以兼顧到功耗。

最終實現(xiàn)的效果(沒對焦):

Android 音視頻入門 (四)- 記錄一次MediaCodec ,天吶,2024年程序員學(xué)習(xí),android,音視頻

附. 一些相關(guān)的方法:

1. 橫屏Nv21->豎屏Nv21的排列:

public byte[] rotateYUV420Degree90(byte[] data, int imageWidth, int imageHeight) {
byte[] yuv = new byte[imageWidth * imageHeight * 3 / 2];
// Rotate the Y luma
int i = 0;
for (int x = 0; x < imageWidth; x++) {
for (int y = imageHeight - 1; y >= 0; y–) {
yuv[i] = data[y * imageWidth + x];
i++;
}
}
// Rotate the U and V color components
i = imageWidth * imageHeight * 3 / 2 - 1;
for (int x = imageWidth - 1; x > 0; x = x - 2) {
for (int y = 0; y < imageHeight / 2; y++) {
yuv[i] = data[(imageWidth * imageHeight) + (y * imageWidth) + (x - 1)];
i–;
yuv[i] = data[(imageWidth * imageHeight) + (y * imageWidth) + x];
i–;
}
}
return yuv;
}

2. 查詢設(shè)備支持的色彩格式

public static int getSupportColorFormat() {
int numCodecs = MediaCodecList.getCodecCount();
MediaCodecInfo codecInfo = null;
for (int i = 0; i < numCodecs && codecInfo == null; i++) {
MediaCodecInfo info = MediaCodecList.getCodecInfoAt(i);
if (!info.isEncoder()) {
continue;
}
String[] types = info.getSupportedTypes();
boolean found = false;

自我介紹一下,小編13年上海交大畢業(yè),曾經(jīng)在小公司待過,也去過華為、OPPO等大廠,18年進(jìn)入阿里一直到現(xiàn)在。

深知大多數(shù)Android工程師,想要提升技能,往往是自己摸索成長或者是報班學(xué)習(xí),但對于培訓(xùn)機(jī)構(gòu)動則幾千的學(xué)費,著實壓力不小。自己不成體系的自學(xué)效果低效又漫長,而且極易碰到天花板技術(shù)停滯不前!

因此收集整理了一份《2024年Android移動開發(fā)全套學(xué)習(xí)資料》,初衷也很簡單,就是希望能夠幫助到想自學(xué)提升又不知道該從何學(xué)起的朋友,同時減輕大家的負(fù)擔(dān)。
Android 音視頻入門 (四)- 記錄一次MediaCodec ,天吶,2024年程序員學(xué)習(xí),android,音視頻
Android 音視頻入門 (四)- 記錄一次MediaCodec ,天吶,2024年程序員學(xué)習(xí),android,音視頻
Android 音視頻入門 (四)- 記錄一次MediaCodec ,天吶,2024年程序員學(xué)習(xí),android,音視頻
Android 音視頻入門 (四)- 記錄一次MediaCodec ,天吶,2024年程序員學(xué)習(xí),android,音視頻
Android 音視頻入門 (四)- 記錄一次MediaCodec ,天吶,2024年程序員學(xué)習(xí),android,音視頻
Android 音視頻入門 (四)- 記錄一次MediaCodec ,天吶,2024年程序員學(xué)習(xí),android,音視頻

既有適合小白學(xué)習(xí)的零基礎(chǔ)資料,也有適合3年以上經(jīng)驗的小伙伴深入學(xué)習(xí)提升的進(jìn)階課程,基本涵蓋了95%以上Android開發(fā)知識點,真正體系化!

Android 音視頻入門 (四)- 記錄一次MediaCodec ,天吶,2024年程序員學(xué)習(xí),android,音視頻
Android 音視頻入門 (四)- 記錄一次MediaCodec ,天吶,2024年程序員學(xué)習(xí),android,音視頻

由于文件比較大,這里只是將部分目錄大綱截圖出來,每個節(jié)點里面都包含大廠面經(jīng)、學(xué)習(xí)筆記、源碼講義、實戰(zhàn)項目、講解視頻,并且后續(xù)會持續(xù)更新
如果你覺得這些內(nèi)容對你有幫助,可以添加V:vip204888 備注Android獲?。ㄙY料價值較高,非無償)
Android 音視頻入門 (四)- 記錄一次MediaCodec ,天吶,2024年程序員學(xué)習(xí),android,音視頻

最后

在這里我和身邊一些朋友特意整理了一份快速進(jìn)階為Android高級工程師的系統(tǒng)且全面的學(xué)習(xí)資料。涵蓋了Android初級——Android高級架構(gòu)師進(jìn)階必備的一些學(xué)習(xí)技能。

附上:我們之前因為秋招收集的二十套一二線互聯(lián)網(wǎng)公司Android面試真題(含BAT、小米、華為、美團(tuán)、滴滴)和我自己整理Android復(fù)習(xí)筆記(包含Android基礎(chǔ)知識點、Android擴(kuò)展知識點、Android源碼解析、設(shè)計模式匯總、Gradle知識點、常見算法題匯總。)
Android 音視頻入門 (四)- 記錄一次MediaCodec ,天吶,2024年程序員學(xué)習(xí),android,音視頻

id高級架構(gòu)師進(jìn)階必備的一些學(xué)習(xí)技能。**

附上:我們之前因為秋招收集的二十套一二線互聯(lián)網(wǎng)公司Android面試真題(含BAT、小米、華為、美團(tuán)、滴滴)和我自己整理Android復(fù)習(xí)筆記(包含Android基礎(chǔ)知識點、Android擴(kuò)展知識點、Android源碼解析、設(shè)計模式匯總、Gradle知識點、常見算法題匯總。)
[外鏈圖片轉(zhuǎn)存中…(img-7kBRVeTn-1711545185388)]

本文已被CODING開源項目:《Android學(xué)習(xí)筆記總結(jié)+移動架構(gòu)視頻+大廠面試真題+項目實戰(zhàn)源碼》收錄文章來源地址http://www.zghlxwxcb.cn/news/detail-853252.html

到了這里,關(guān)于Android 音視頻入門 (四)- 記錄一次MediaCodec ,天吶的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • Android-音視頻學(xué)習(xí)系列-(二)-交叉編譯動態(tài)庫、靜態(tài)庫的入門學(xué)習(xí)

    Android-音視頻學(xué)習(xí)系列-(二)-交叉編譯動態(tài)庫、靜態(tài)庫的入門學(xué)習(xí)

    gcc -S test.i -o test.s//-S 的作用是編譯結(jié)束生成匯編文件。 匯編階段 匯編階段把 .S 文件翻譯成二進(jìn)制機(jī)器指令文件 .o ,這個階段接收.c ,.i ,.s 的文件都沒有問題。 下面我們通過以下命令生成二進(jìn)制機(jī)器指令文件 .o 文件: gcc -c test.s -o test.o 鏈接階段 鏈接階段,鏈接的是函數(shù)庫。

    2024年04月09日
    瀏覽(26)
  • 精選58道——Android 音視頻面試題_安卓音視頻面試題(3)

    精選58道——Android 音視頻面試題_安卓音視頻面試題(3)

    先自我介紹一下,小編浙江大學(xué)畢業(yè),去過華為、字節(jié)跳動等大廠,目前阿里P7 深知大多數(shù)程序員,想要提升技能,往往是自己摸索成長,但自己不成體系的自學(xué)效果低效又漫長,而且極易碰到天花板技術(shù)停滯不前! 因此收集整理了一份《2024年最新Android移動開發(fā)全套學(xué)習(xí)資

    2024年04月28日
    瀏覽(34)
  • Android音視頻編碼(2)

    Android音視頻編碼(2)

    Android本身提供了音視頻編解碼工具,很多時候是不需要第三方工具的,比如 ffmpeg , OpenCV 等,在android中引入第三庫比較復(fù)雜,在Android音視頻編碼中介紹了如何引入第三方庫libpng來進(jìn)行進(jìn)行圖片處理,同時引入這些第三方庫,是程序結(jié)構(gòu)變得復(fù)雜。 本文介紹的音視頻編解碼利

    2024年01月17日
    瀏覽(23)
  • Android 音視頻開發(fā) - VideoView

    本篇文章主要介紹下Android 中的VideoView. VideoView是一個用于播放視頻的視圖組件,可以方便地在應(yīng)用程序中播放本地或網(wǎng)絡(luò)上的視頻文件。 VideoView可以直接在布局文件中使用,也可以在代碼中動態(tài)創(chuàng)建。 它封裝了MediaPlayer和SurfaceView,提供了簡單的接口來控制視頻的播放和顯示

    2024年04月08日
    瀏覽(28)
  • Android之 集成音視頻通話

    Android之 集成音視頻通話

    一,背景 1.1 最近接收一個即時通訊二開項目,即時通訊部分用的XMPP協(xié)議,音視頻則是集成的國外的開源免費庫jitsi-meet-sdk-2.4.0-4.aar,是基于WebRTC的開源框架。但客戶想要微信那種頁面的排版,后來經(jīng)研究jitsi是不能修改UI的,UI部分是用混合框架ReactNative寫的,這樣難度就大了

    2024年02月12日
    瀏覽(32)
  • Android音視頻之協(xié)議介紹

    Android音視頻之協(xié)議介紹

    本文對音視頻的協(xié)議起源做詳細(xì)介紹,學(xué)習(xí)之后可以加深對音視頻知識的了解。 這里的音視頻不僅針對Android平臺,其他平臺也通用。 一般是指以某種格式封裝了音視頻數(shù)據(jù)的文件 常見的音頻格式:mp3、wma、avi、rm、rmvb、flv、mpg、mov、mkv等。 常見的視頻格式:rmvb、rm、wmv、

    2023年04月19日
    瀏覽(21)
  • Android音視頻: 引入FFmpeg

    Android音視頻: 引入FFmpeg

    本文你可以了解到 本文將介紹如何將上一篇文章編譯出來的? FFmpeg so ?庫,引入到? Android ?工程中,并驗證? so ?是否可以正常使用。 一、開啟 Android 原生 C/C++ 支持 在過去,通常使用? makefile ?的方式在項目中引入? C/C++ ?代碼支持,隨著? Android Studio ?的普及, makefile ?的

    2024年02月02日
    瀏覽(27)
  • Android音視頻開發(fā) - MediaMetadataRetriever 相關(guān)

    MediaMetadataRetriever 是android中用于從媒體文件中提取元數(shù)據(jù)新的類. 可以獲取音頻,視頻和圖像文件的各種信息,如時長,標(biāo)題,封面等. 需要申請 讀寫權(quán)限 . 這里我使用的是本地路徑, 需要注意的是如果路徑文件不存在,會拋出 IllegalArgumentException,具體的源碼如下: 根據(jù)keyCode返回keyC

    2024年04月08日
    瀏覽(31)
  • 音視頻入門知識學(xué)習(xí)

    音視頻入門知識學(xué)習(xí)

    1920x1080的屏幕,32位,30幀的fps。一秒鐘需要1920x1080x32x30字節(jié),所以需要壓縮 壓縮的核心思想就是去除冗余信息 空間冗余 空間冗余 == 相鄰像素重復(fù):圖像內(nèi)部相鄰像素之間存在較強(qiáng)的相關(guān)性多造成的冗余 比如一張圖片中間的一個位置大小20x20,它的表現(xiàn)肉眼看起來其實是一

    2024年02月12日
    瀏覽(17)
  • uniapp:記錄使用uniapp對接騰訊音視頻插件(TUICallKit )

    uniapp:記錄使用uniapp對接騰訊音視頻插件(TUICallKit )

    官方地址:TUICallKit—API uniapp插件地址:騰訊云音視頻通話插件TencentCloud-TUICallKit 1、到鷈插件地址,購買插件,并綁定到自己的項目中。 第3步的報名,一定要與最后打包包名一致。輸入包名后:下一步-------確定。 2、開通服務(wù) 1.登錄到 即時通信 IM 控制臺,單擊創(chuàng)建新應(yīng)用,

    2024年02月10日
    瀏覽(24)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包