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

HarmonyOS學(xué)習(xí)路之開發(fā)篇—多媒體開發(fā)(相機開發(fā) 二)

這篇具有很好參考價值的文章主要介紹了HarmonyOS學(xué)習(xí)路之開發(fā)篇—多媒體開發(fā)(相機開發(fā) 二)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

?相機幀捕獲

Camera操作類,包括相機預(yù)覽、錄像、拍照等功能接口。

接口名

描述

triggerSingleCapture?(FrameConfig frameConfig)

啟動相機幀的單幀捕獲。

triggerMultiCapture?(List<FrameConfig> frameConfigs)

啟動相機幀的多幀捕獲。

configure?(CameraConfig config)

配置相機。

flushCaptures?()

停止并清除相機幀的捕獲,包括循環(huán)幀/單幀/多幀捕獲。

getCameraConfigBuilder?()

獲取相機配置構(gòu)造器對象。

getCameraId?()

獲取當(dāng)前相機的ID。

getFrameConfigBuilder?(int type)

獲取指定類型的相機幀配置構(gòu)造器對象。

release?()

釋放相機對象及資源。

triggerLoopingCapture?(FrameConfig frameConfig)

啟動或者更新相機幀的循環(huán)捕獲。

stopLoopingCapture?()

停止當(dāng)前相機幀的循環(huán)捕獲。

啟動預(yù)覽(循環(huán)幀捕獲)

用戶一般都是先看見預(yù)覽畫面才執(zhí)行拍照或者其他功能,所以對于一個普通的相機應(yīng)用,預(yù)覽是必不可少的。啟動預(yù)覽的建議步驟如下:

1. 通過getFrameConfigBuilder(FRAME_CONFIG_PREVIEW)方法獲取預(yù)覽配置模板,常用幀配置項見下表,更多的幀配置項以及詳細使用方法請參考API接口說明的FrameConfig.Builder部分。

接口名

描述

是否必選

addSurface(Surface surface)

配置預(yù)覽surface和幀的綁定。

setAfMode(int afMode, Rect rect)

配置對焦模式。

setAeMode(int aeMode, Rect rect)

配置曝光模式。

setZoom(float value)

配置變焦值。

setFlashMode(int flashMode)

配置閃光燈模式。

setFaceDetection(int type, boolean isEnable)

配置人臉檢測或者笑臉檢測。

setParameter(Key<T> key, T value)

配置其他屬性(如自拍鏡像等)。

setMark(Object mark)

配置一個標(biāo)簽,后續(xù)可以從FrameConfig中通過Object getMark()拿到標(biāo)簽,判斷兩個是否相等,相等就說明是同一個配置。

setCoordinateSurface(Surface surface)

配置坐標(biāo)系基準(zhǔn)Surface,后續(xù)計算Ae/Af等區(qū)域都會基于此Surface為基本的中心坐標(biāo)系,不設(shè)置默認使用添加的第一個Surface。

2. 通過triggerLoopingCapture(FrameConfig)方法實現(xiàn)循環(huán)幀捕獲(如預(yù)覽/錄像)。

private final class CameraStateCallbackImpl extends CameraStateCallback {
    @Override
    public void onConfigured(Camera camera) {
        // 獲取預(yù)覽配置模板
        frameConfigBuilder = camera.getFrameConfigBuilder(FRAME_CONFIG_PREVIEW);
        // 配置預(yù)覽Surface
        frameConfigBuilder.addSurface(previewSurface);
        previewFrameConfig = frameConfigBuilder.build();
        try {
            // 啟動循環(huán)幀捕獲
            int triggerId = camera.triggerLoopingCapture(previewFrameConfig);
        } catch (IllegalArgumentException e) {
            HiLog.error(LABEL, "Argument Exception");
        } catch (IllegalStateException e) {
            HiLog.error(LABEL, "State Exception");
         }
    }
}

經(jīng)過以上的操作,相機應(yīng)用已經(jīng)可以正常進行實時預(yù)覽了。在預(yù)覽狀態(tài)下,開發(fā)者還可以執(zhí)行其他操作,比如:

當(dāng)預(yù)覽幀配置更改時,可以通過triggerLoopingCapture(FrameConfig)方法實現(xiàn)預(yù)覽幀配置的更新;

// 預(yù)覽幀變焦值變更
frameConfigBuilder.setZoom(1.2f);
// 調(diào)用triggerLoopingCapture方法實現(xiàn)預(yù)覽幀配置更新
triggerLoopingCapture(frameConfigBuilder.build());

通過stopLoopingCapture()方法停止循環(huán)幀捕獲(停止預(yù)覽)。

// 停止預(yù)覽幀捕獲
camera.stopLoopingCapture()

實現(xiàn)拍照(單幀捕獲)

拍照功能屬于相機應(yīng)用的最重要功能之一,而且照片質(zhì)量對用戶至關(guān)重要。相機模塊基于相機復(fù)雜的邏輯,從應(yīng)用接口層到器件驅(qū)動層都已經(jīng)默認的做好了最適合用戶的配置,這些默認配置盡可能地保證用戶拍出的每張照片的質(zhì)量。發(fā)起拍照的建議步驟如下:

1. 通過getFrameConfigBuilder(FRAME_CONFIG_PICTURE)方法獲取拍照配置模板,并且設(shè)置拍照幀配置,如下表

接口名

描述

是否必選

FrameConfig.Builder addSurface(Surface)

實現(xiàn)拍照Surface和幀的綁定。

必選

FrameConfig.Builder setImageRotation(int)

設(shè)置圖片旋轉(zhuǎn)角度。

可選

FrameConfig.Builder setLocation(Location)

設(shè)置圖片地理位置信息。

可選

FrameConfig.Builder setParameter(Key<T>, T)

配置其他屬性(如自拍鏡像等)。

可選

2.?拍照前準(zhǔn)備圖像幀數(shù)據(jù)的接收實現(xiàn)

// 圖像幀數(shù)據(jù)接收處理對象       
private ImageReceiver imageReceiver;
// 執(zhí)行回調(diào)的EventHandler
private EventHandler eventHandler = new EventHandler(EventRunner.create("CameraCb"));
// 拍照支持分辨率
private Size pictureSize;

// 單幀捕獲生成圖像回調(diào)Listener
private final ImageReceiver.IImageArrivalListener imageArrivalListener = new ImageReceiver.IImageArrivalListener() {
    @Override
    public void onImageArrival(ImageReceiver imageReceiver) {
        StringBuffer fileName = new StringBuffer("picture_"); 
        fileName.append(UUID.randomUUID()).append(".jpg"); // 定義生成圖片文件名
        File myFile = new File(dirFile, fileName.toString()); // 創(chuàng)建圖片文件
        imageSaver = new ImageSaver(imageReceiver.readNextImage(), myFile); // 創(chuàng)建一個讀寫線程任務(wù)用于保存圖片
        eventHandler.postTask(imageSaver); // 執(zhí)行讀寫線程任務(wù)生成圖片
    }
};

// 保存圖片, 圖片數(shù)據(jù)讀寫,及圖像生成見run方法
class ImageSaver implements Runnable {
    private final Image myImage;
    private final File myFile;

    ImageSaver(Image image, File file) {
        myImage = image;
        myFile = file;
    }

    @Override
    public void run() {
        Image.Component component = myImage.getComponent(ImageFormat.ComponentType.JPEG);
        byte[] bytes = new byte[component.remaining()];
        component.read(bytes);
        FileOutputStream output = null;
        try {
            output = new FileOutputStream(myFile);
            output.write(bytes); // 寫圖像數(shù)據(jù)
        } catch (IOException e) {
            HiLog.error(LABEL, "save picture occur exception!");
        } finally {
            if (output != null) {
                try {
                    output.close(); // 關(guān)閉流
                } catch (IOException e) {
                    HiLog.error(LABEL, "image release occur exception!");
                }
            }
            myImage.release();
        }
    }
}
private void takePictureInit() {
    List<Size> pictureSizes = cameraAbility.getSupportedSizes(ImageFormat.JPEG); // 獲取拍照支持分辨率列表
    pictureSize = getPictureSize(pictureSizes) // 根據(jù)拍照要求選擇合適的分辨率
    imageReceiver = ImageReceiver.create(Math.max(pictureSize.width, pictureSize.height),
        Math.min(pictureSize.width, pictureSize.height), ImageFormat.JPEG, 5); // 創(chuàng)建ImageReceiver對象,注意create函數(shù)中寬度要大于高度;5為最大支持的圖像數(shù),請根據(jù)實際設(shè)置。
    imageReceiver.setImageArrivalListener(imageArrivalListener);
}

3.?通過triggerSingleCapture(FrameConfig)方法實現(xiàn)單幀捕獲(如拍照)。

private void capture() {
    // 獲取拍照配置模板
    framePictureConfigBuilder = cameraDevice.getFrameConfigBuilder(FRAME_CONFIG_PICTURE);
    // 配置拍照Surface
    framePictureConfigBuilder.addSurface(imageReceiver.getRecevingSurface());
    // 配置拍照其他參數(shù)
    framePictureConfigBuilder.setImageRotation(90);
    try {
        // 啟動單幀捕獲(拍照)
        cameraDevice.triggerSingleCapture(framePictureConfigBuilder.build());
    } catch (IllegalArgumentException e) {
        HiLog.error(LABEL, "Argument Exception");
    } catch (IllegalStateException e) {
        HiLog.error(LABEL, "State Exception");
    }
}

為了捕獲到質(zhì)量更高和效果更好的圖片,還可以在幀結(jié)果中實時監(jiān)測自動對焦和自動曝光的狀態(tài),一般而言,在自動對焦完成,自動曝光收斂后的瞬間是發(fā)起單幀捕獲的最佳時機。

實現(xiàn)連拍(多幀捕獲)

連拍功能方便用戶一次拍照獲取多張照片,用于捕捉精彩瞬間。同普通拍照的實現(xiàn)流程一致,但連拍需要使用triggerMultiCapture(List<FrameConfig> frameConfigs)方法。

啟動錄像(循環(huán)幀捕獲)

啟動錄像和啟動預(yù)覽類似,但需要另外配置錄像Surface才能使用。

1.?錄像前需要進行音視頻模塊的配置。

private Source source; // 音視頻源
private AudioProperty.Builder audioPropertyBuilder; // 音頻屬性構(gòu)造器
private VideoProperty.Builder videoPropertyBuilder; // 視頻屬性構(gòu)造器
private StorageProperty.Builder storagePropertyBuilder; // 音視頻存儲屬性構(gòu)造器
private Recorder mediaRecorder; // 錄像操作對象
private String recordName; // 音視頻文件名
private Size mRecordSize; // 錄像分辨率

private void initMediaRecorder() {
    videoPropertyBuilder.setRecorderBitRate(10000000); // 設(shè)置錄制比特率
    int rotation = DisplayManager.getInstance().getDefaultDisplay(this).get().getRotation();
    videoPropertyBuilder.setRecorderDegrees(getOrientation(rotation)); // 設(shè)置錄像方向
    videoPropertyBuilder.setRecorderFps(30); // 設(shè)置錄制采樣率
    videoPropertyBuilder.setRecorderHeight(Math.min(recordSize.height, recordSize.width)); // 設(shè)置錄像支持的分辨率,需保證width > height
    videoPropertyBuilder.setRecorderWidth(Math.max(recordSize.height, recordSize.width));
    videoPropertyBuilder.setRecorderVideoEncoder(Recorder.VideoEncoder.H264); // 設(shè)置視頻編碼方式
    videoPropertyBuilder.setRecorderRate(30); // 設(shè)置錄制幀率
    source.setRecorderAudioSource(Recorder.AudioSource.MIC); // 設(shè)置錄制音頻源
    source.setRecorderVideoSource(Recorder.VideoSource.SURFACE); // 設(shè)置視頻窗口
    mediaRecorder.setSource(source); // 設(shè)置音視頻源
    mediaRecorder.setOutputFormat(Recorder.OutputFormat.MPEG_4); // 設(shè)置音視頻輸出格式
    StringBuffer fileName = new StringBuffer("record_"); // 生成隨機文件名
    fileName.append(UUID.randomUUID()).append(".mp4");
    recordName = fileName.toString();
    File file = new File(dirFile, recordName); // 創(chuàng)建錄像文件對象
    storagePropertyBuilder.setRecorderFile(file); // 設(shè)置存儲音視頻文件名
    mediaRecorder.setStorageProperty(storagePropertyBuilder.build());
    audioPropertyBuilder.setRecorderAudioEncoder(Recorder.AudioEncoder.AAC); // 設(shè)置音頻編碼格式
    mediaRecorder.setAudioProperty(audioPropertyBuilder.build()); // 設(shè)置音頻屬性
    mediaRecorder.setVideoProperty(videoPropertyBuilder.build()); // 設(shè)置視頻屬性
    mediaRecorder.prepare(); // 準(zhǔn)備錄制
    HiLog.info(LABEL, "initMediaRecorder end");
}

2.?配置錄像幀,啟動錄像

private final class CameraStateCallbackImpl extends CameraStateCallback {
    @Override
    public void onConfigured(Camera camera) {
        // 獲取錄像配置模板
        frameConfigBuilder = camera.getFrameConfigBuilder(FRAME_CONFIG_RECORD);
        // 配置預(yù)覽Surface
        frameConfigBuilder.addSurface(previewSurface);
        // 配置錄像的Surface
        mRecorderSurface = mediaRecorder.getVideoSurface();
        frameConfigBuilder.addSurface(mRecorderSurface);
        previewFrameConfig = frameConfigBuilder.build();
        try {
            // 啟動循環(huán)幀捕獲
            int triggerId = camera.triggerLoopingCapture(previewFrameConfig);
        } catch (IllegalArgumentException e) {
            HiLog.error(LABEL, "Argument Exception");
        } catch (IllegalStateException e) {
            HiLog.error(LABEL, "State Exception");
        }
    }
}

相機設(shè)備釋放

使用完相機后,必須通過release()來關(guān)閉相機和釋放資源,否則可能導(dǎo)致其他相機應(yīng)用無法啟動。一旦相機被釋放,它所提供的操作就不能再被調(diào)用,否則會導(dǎo)致不可預(yù)期的結(jié)果,或是會引發(fā)狀態(tài)異常。

相機設(shè)備釋放的示例代碼如下:文章來源地址http://www.zghlxwxcb.cn/news/detail-506909.html

private void releaseCamera() {
    if (camera != null) {
        // 關(guān)閉相機和釋放資源
        camera.release();
        camera = null;
    }
    // 拍照配置模板置空
    framePictureConfigBuilder = null;
    // 預(yù)覽配置模板置空
    previewFrameConfig = null;
}

到了這里,關(guān)于HarmonyOS學(xué)習(xí)路之開發(fā)篇—多媒體開發(fā)(相機開發(fā) 二)的文章就介紹完了。如果您還想了解更多內(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īng)查實,立即刪除!

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

相關(guān)文章

  • 鴻蒙HarmonyOS開發(fā)實戰(zhàn)—多媒體開發(fā)(音頻開發(fā) 一)

    鴻蒙HarmonyOS開發(fā)實戰(zhàn)—多媒體開發(fā)(音頻開發(fā) 一)

    HarmonyOS音頻模塊支持音頻業(yè)務(wù)的開發(fā),提供音頻相關(guān)的功能,主要包括音頻播放、音頻采集、音量管理和短音播放等。 基本概念 采樣 采樣是指將連續(xù)時域上的模擬信號按照一定的時間間隔采樣,獲取到離散時域上離散信號的過程。 采樣率 采樣率為每秒從連續(xù)信號中提取并

    2024年01月24日
    瀏覽(28)
  • 多媒體開發(fā)之cgo

    多媒體開發(fā)之cgo

    ???? go語言作為近十年來優(yōu)秀的現(xiàn)代開發(fā)語言的代表,由于繼承了c語言的簡潔和很多現(xiàn)代語言的表達方式,在廣泛的應(yīng)用場景中得到眾多愛好者的喜愛,如何將go和c、c++進行聯(lián)合開發(fā),拓展整個開發(fā)生態(tài),不用重復(fù)造輪子,掌握cgo可以讓你得心應(yīng)手的在c和go之間傳遞信息,

    2024年02月16日
    瀏覽(26)
  • Android多媒體功能開發(fā)(2)——FileProvider

    使用系統(tǒng)多媒體界面需要在我們的應(yīng)用和其他應(yīng)用之間通過Intent傳遞音頻、圖片、視頻文件的信息。隨著Android版本的升級,對應(yīng)用數(shù)據(jù)安全性方面的限制越來越多。 Android 6以后不允許應(yīng)用在外部存儲隨便創(chuàng)建目錄,只能在Android規(guī)定的應(yīng)用自己的文件目錄下創(chuàng)建目錄,該目錄

    2024年02月14日
    瀏覽(26)
  • qt6 多媒體開發(fā)代碼分析(二、錄音)

    常見的音頻編碼格式包括MP3、AAC、OGG、WMA、FLAC等,它們之間具有以下區(qū)別: 編碼方式不同:這些編碼格式采用的編碼算法不同,例如MP3和AAC使用有損壓縮算法,而FLAC使用無損壓縮算法。 壓縮率和文件大小不同:由于采用的編碼算法不同,不同格式的音頻文件壓縮率和文件大

    2024年02月07日
    瀏覽(17)
  • HTML-多媒體嵌入-MDN文檔學(xué)習(xí)筆記

    HTML-多媒體嵌入-MDN文檔學(xué)習(xí)筆記

    查看更多學(xué)習(xí)筆記:GitHub:LoveEmiliaForever MDN中文官網(wǎng) 將圖片放入網(wǎng)頁 可以使用 img/ 來將圖片嵌入網(wǎng)頁,它是一個空元素,最少只需 src 屬性即可工作 src 指向圖片資源的地址,是 img/ 正常工作必不可少的屬性 ??除非有必要,否則 永遠不要 把 src 指向其它網(wǎng)站上的圖片,這

    2024年02月20日
    瀏覽(24)
  • Android多媒體功能開發(fā)(12)——使用Camera類拍照

    Android多媒體功能開發(fā)(12)——使用Camera類拍照

    Android上用攝像頭拍照、錄視頻有兩套API可用,Android5.0(API21)之前使用android.hardware.Camera類,之后推薦使用android.hardware.camera2包。目前這兩套API都可以使用,Camera類用起來比較簡單易懂,但功能少靈活性差,所以現(xiàn)在降級使用;Camera2框架功能強大,對攝像頭的控制靈活,但由于

    2023年04月13日
    瀏覽(25)
  • Android多媒體功能開發(fā)(11)——使用AudioRecord類錄制音頻

    Android多媒體功能開發(fā)(11)——使用AudioRecord類錄制音頻

    AudioRecord類優(yōu)點是能錄制到緩沖區(qū),能夠?qū)崿F(xiàn)邊錄邊播(AudioRecord + AudioTrack)以及對音頻的實時處理(如QQ電話)。缺點是輸出是PCM格式的原始采集數(shù)據(jù),如果直接保存成音頻文件,不能夠被播放器播放,所以必須用代碼實現(xiàn)數(shù)據(jù)編碼以及壓縮。 使用AudioRecord錄音的基本步驟是

    2023年04月09日
    瀏覽(23)
  • 【軟考程序員學(xué)習(xí)筆記】——多媒體基礎(chǔ)知識

    【軟考程序員學(xué)習(xí)筆記】——多媒體基礎(chǔ)知識

    目錄 ???一、多媒體的概念及分類 多媒體的分類 ??二、聲音信號的數(shù)字化過程 采樣 量化 編碼 ??三、常見音頻文件格式 ??四、圖形/圖像區(qū)別 ?圖形 圖像 ??五、常見圖像文件格式 ??六、常見視頻文件格式 ??七、顯示器的基本參數(shù) 傳播信息的載體,如語言、文字、圖

    2024年02月09日
    瀏覽(23)
  • SDL庫入門:掌握跨平臺游戲開發(fā)和多媒體編程

    SDL (Simple DirectMedia Layer) 是一個跨平臺的開源多媒體庫,它提供了訪問音頻、鍵盤、鼠標(biāo)、操縱桿以及圖形硬件的底層接口。SDL 可用于開發(fā)游戲、仿真器、媒體播放器等多種類型的應(yīng)用程序。 1.1 SDL 的背景與應(yīng)用領(lǐng)域 SDL 由 Sam Lantinga 開發(fā),最早發(fā)布于 1998 年。SDL 的設(shè)計目標(biāo)是

    2024年02月02日
    瀏覽(23)
  • 15-1_Qt 5.9 C++開發(fā)指南_Qt多媒體模塊概述

    15-1_Qt 5.9 C++開發(fā)指南_Qt多媒體模塊概述

    多媒體功能指的主要是計算機的音頻和視頻的輸入、輸出、顯示和播放等功能,Qt 的多媒體模塊為音頻和視頻播放、錄音、攝像頭拍照和錄像等提供支持,甚至還提供數(shù)字收音機的支持。本章將介紹 Qt 多媒體模塊的功能和使用。 Qt 多媒體模塊提供了很多類,可以實現(xiàn)如下的

    2024年02月13日
    瀏覽(39)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包