日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

HarmonyOS之深入解析视频的功能和使用

發布時間:2024/5/21 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 HarmonyOS之深入解析视频的功能和使用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、基本概念

  • HarmonyOS 視頻模塊支持視頻業務的開發和生態開放,開發者可以通過已開放的接口很容易地實現視頻媒體的播放、操作和新功能開發。
  • 視頻媒體的常見操作有視頻編解碼、視頻合成、視頻提取、視頻播放以及視頻錄制等。
  • 編碼:編碼是信息從一種形式或格式轉換為另一種形式的過程。用預先規定的方法將文字、數字或其他對象編成數碼,或將信息、數據轉換成規定的電脈沖信號。在本模塊中,編碼是指編碼器將原始的視頻信息壓縮為另一種格式的過程。
  • 解碼:解碼是一種用特定方法,把數碼還原成它所代表的內容或將電脈沖信號、光信號、無線電波等轉換成它所代表的信息、數據等的過程。在本模塊中,解碼是指解碼器將接收到的數據還原為視頻信息的過程,與編碼過程相對應。
  • 幀率:幀率是以幀為單位的位圖圖像連續出現在顯示器上的頻率(速率),以赫茲(Hz)為單位。

二、媒體編解碼能力查詢

① 應用場景
  • 媒體編解碼能力查詢主要指查詢設備所支持的編解碼器的 MIME(Multipurpose Internet Mail Extensions,媒體類型)列表,并判斷設備是否支持指定 MIME 對應的編碼器/解碼器。
② 媒體編解碼能力 API
  • 媒體編解碼能力查詢類 CodecDescriptionList 的主要接口:
接口名功能描述
getSupportedMimes()獲取某設備所支持的編解碼器的MIME列表
isDecodeSupportedByMime(String mime)判斷某設備是否支持指定MIME對應的解碼器
isEncodeSupportedByMime(String mime)判斷某設備是否支持指定MIME對應的編碼器
isDecoderSupportedByFormat(Format format)判斷某設備是否支持指定媒體格式對應的解碼器
isEncoderSupportedByFormat(Format format)判斷某設備是否支持指定媒體格式對應的編碼器
③ 媒體編解碼能力查詢
  • 調用 CodecDescriptionList 類的靜態 getSupportedMimes() 方法,獲取某設備所支持的編解碼器的 MIME 列表。代碼示例如下:
List<String> mimes = CodecDescriptionList.getSupportedMimes();
  • 調用 CodecDescriptionList 類的靜態 isDecodeSupportedByMime 方法,判斷某設備是否支持指定 MIME 對應的解碼器,支持返回 true,否則返回 false。代碼示例如下:
boolean result = CodecDescriptionList.isDecodeSupportedByMime(Format.VIDEO_VP9);
  • 調用 CodecDescriptionList 類的靜態 isEncodeSupportedByMime 方法,判斷某設備是否支持指定 MIME 對應的編碼器,支持返回 true,否則返回 false。代碼示例如下:
boolean result = CodecDescriptionList.isEncodeSupportedByMime(Format.AUDIO_FLAC);
  • 調用 CodecDescriptionList 類的靜態 isDecoderSupportedByFormat/isEncoderSupportedByFormat 方法,判斷某設備是否支持指定 Format 的編解碼器,支持返回 true,否則返回 false。代碼示例如下:
Format format = new Format();format.putStringValue(Format.MIME, Format.VIDEO_AVC); format.putIntValue(Format.WIDTH, 2560); format.putIntValue(Format.HEIGHT, 1440); format.putIntValue(Format.FRAME_RATE, 30); format.putIntValue(Format.FRAME_INTERVAL, 1); boolean result = CodecDescriptionList.isDecoderSupportedByFormat(format); result = CodecDescriptionList.isEncoderSupportedByFormat(format);

三、視頻編解碼

① 視頻編解碼 API
  • 視頻編解碼類 Codec 的主要接口:
接口名功能描述
createDecoder()創建解碼器Codec實例
createEncoder()創建編碼器Codec實例
registerCodecListener(ICodecListener listener)注冊偵聽器用來異步接收編碼或解碼后的數據
setSource(Source source, TrackInfo trackInfo)根據解碼器的源軌道信息設置數據源,對于編碼器trackInfo無效
setSourceFormat(Format format)編碼器的管道模式下,設置編碼器編碼格式
setCodecFormat(Format format)普通模式設置編/解碼器參數
setVideoSurface(Surface surface)設置解碼器的Surface
getAvailableBuffer(long timeout)普通模式獲取可用ByteBuffer。
writeBuffer(ByteBuffer buffer, BufferInfo info)推送源數據給Codec
getBufferFormat(ByteBuffer buffer)獲取輸出Buffer數據格式
start()啟動編/解碼
stop()停止編/解碼
release()釋放所有資源
② 普通模式
  • 在普通模式下進行編解碼,應用必須持續地傳輸數據到 Codec 實例。
  • 編碼的具體步驟如下:
    • 創建編碼 Codec 實例,可調用 createEncoder() 創建。
final Codec encoder = Codec.createEncoder();
    • 構造數據源格式,并設置給 Codec 實例,調用 setCodecFormat(),代碼示例如下:
Format fmt = new Format();fmt.putStringValue(Format.MIME, Format.VIDEO_AVC);fmt.putIntValue(Format.WIDTH, 1920);fmt.putIntValue(Format.HEIGHT, 1080);fmt.putIntValue(Format.BIT_RATE, 392000);fmt.putIntValue(Format.FRAME_RATE, 30);fmt.putIntValue(Format.FRAME_INTERVAL, 30); codec.setCodecFormat(fmt);
    • 如果需要編碼過程中,檢測是否讀取到 Buffer 數據以及是否發生異常,可以構造 ICodecListener,ICodecListener 需要實現兩個方法,實現讀到 Buffer 數據時、編碼發生異常時做相應的操作。上面的例子中讀到 Buffer 時,獲取 buffer 的 format 格式,異常時拋出運行時異常,代碼示例如下:
Codec.ICodecListener listener = new Codec.ICodecListener() {@Overridepublic void onReadBuffer(ByteBuffer byteBuffer, BufferInfo bufferInfo, int trackId) {Format fmt = codec.getBufferFormat(byteBuffer);}@Overridepublic void onError(int errorCode, int act, int trackId) {HiLog.error(TAG, "CodeListener onError errorCode: %{public}d, act: %{public}d", errorCode, act);}};
    • 調用 start() 方法開始編碼。
    • 調用 getAvailableBuffer() 取到一個可用的 ByteBuffer,把數據填入 ByteBuffer 里,然后再調用 writeBuffer() 把 ByteBuffer 寫入編碼器實例。
    • 調用 stop() 方法停止編碼。
    • 編碼任務結束后,調用 release() 釋放資源。
  • 解碼的具體步驟如下:
    • 創建解碼 Codec 實例,可調用 createDecoder() 創建。
    • 構造數據源格式,并設置給 Codec 實例,調用 setCodecFormat(),代碼示例如下:
Format fmt = new Format();fmt.putStringValue(Format.MIME, Format.VIDEO_AVC);fmt.putIntValue(Format.WIDTH, 1920);fmt.putIntValue(Format.HEIGHT, 1080);fmt.putIntValue(Format.BIT_RATE, 392000);fmt.putIntValue(Format.FRAME_RATE, 30);fmt.putIntValue(Format.FRAME_INTERVAL, -1);codec.setCodecFormat(fmt);
    • (可選)如果需要解碼過程中,檢測是否讀取到 Buffer 數據以及是否發生異常,可以構造 ICodecListener,ICodecListener 需要實現兩個方法,實現讀到 Buffer 數據時、解碼發生異常時做相應的操作。舉例中讀到 buffer 時,獲取 buffer 的 format 格式,異常時拋出運行時異常,代碼示例如下:
Codec.ICodecListener listener = new Codec.ICodecListener() {@Overridepublic void onReadBuffer(ByteBuffer byteBuffer, BufferInfo bufferInfo, int trackId) {Format fmt = codec.getBufferFormat(byteBuffer);}@Overridepublic void onError(int errorCode, int act, int trackId) {throw new RuntimeException();}};
    • 調用 start() 方法開始解碼。
    • 調用 getAvailableBuffer 取到一個可用的 ByteBuffer,把數據填入 ByteBuffer 里,然后再調用 writeBuffer 把 ByteBuffer 寫入解碼器實例。
    • 調用 stop() 方法停止解碼。
    • 解碼任務結束后,調用 release() 釋放資源。
③ 管道模式
  • 管道模式下應用只需要調用 Source 類的 setSource() 方法,數據會自動解析并傳輸給 Codec 實例。
  • 管道模式編碼支持視頻流編碼和音頻流編碼。
  • 編碼的具體步驟如下:
    • 調用 createEncoder() 創建編碼 Codec 實例。
    • 調用 setSource() 設置數據源,支持設定文件路徑或者文件 File Descriptor。
    • 構造數據源格式或者從 Extractor 中讀取數據源格式,并設置給 Codec 實例,調用 setSourceFormat(),構造數據源格式代碼示例如下:
Format fmt = new Format();fmt.putStringValue(Format.MIME, Format.VIDEO_AVC);fmt.putIntValue(Format.WIDTH, 1920);fmt.putIntValue(Format.HEIGHT, 1080);fmt.putIntValue(Format.BIT_RATE, 392000);fmt.putIntValue(Format.FRAME_RATE, 30);fmt.putIntValue(Format.FRAME_INTERVAL, -1);codec.setSourceFormat(fmt);
    • (可選)如果需要編碼過程中,檢測是否讀取到 Buffer 數據以及是否發生異常,可以構造 ICodecListener,ICodecListener 需要實現兩個方法,實現讀到 Buffer 數據時、編碼發生異常時做相應的操作。舉例中讀到 buffer 時,獲取 buffer 的 format 格式,異常時拋出運行時異常,代碼示例如下:
Codec.ICodecListener listener = new Codec.ICodecListener() {@Overridepublic void onReadBuffer(ByteBuffer byteBuffer, BufferInfo bufferInfo, int trackId) {Format fmt = codec.getBufferFormat(byteBuffer);}@Overridepublic void onError(int errorCode, int act, int trackId) {throw new RuntimeException();}};
    • 調用 start() 方法開始編碼。
    • 調用 stop() 方法停止編碼。
    • 編碼任務結束后,調用 release() 釋放資源。
  • 解碼的具體步驟如下:
    • 調用 createDecoder() 創建解碼 Codec 實例。
    • 調用 setSource() 設置數據源,支持設定文件路徑或者文件 File Descriptor。
    • (可選)如果需要解碼過程中,檢測是否讀取到 Buffer 數據以及是否發生異常,可以構造 ICodecListener,ICodecListener 需要實現兩個方法,實現讀到 Buffer 數據時、解碼發生異常時做相應的操作。舉例中讀到 buffer 時,獲取 buffer 的 format 格式,異常時拋出運行時異常,代碼示例如下:
Codec.ICodecListener listener = new Codec.ICodecListener() {@Overridepublic void onReadBuffer(ByteBuffer byteBuffer, BufferInfo bufferInfo, int trackId) {Format fmt = codec.getBufferFormat(byteBuffer);}@Overridepublic void onError(int errorCode, int act, int trackId) {throw new RuntimeException();}};
    • 調用 start() 方法開始解碼。
    • 調用 stop() 方法停止解碼。
    • 解碼任務結束后,調用 release() 釋放資源。

四、視頻播放

① 視頻播放 API
  • 視頻播放包括播放控制、播放設置和播放查詢,如播放的開始/停止、播放速度設置和是否循環播放等。
  • 視頻播放類 Player 的主要接口:
接口名功能描述
Player(Context context)創建Player實例
setSource(Source source)設置媒體源
prepare()準備播放
play()開始播放
pause()暫停播放
stop()停止播放
rewindTo(long microseconds)拖拽播放
setVolume(float volume)調節播放音量
setVideoSurface(Surface surface)設置視頻播放的窗口
enableSingleLooping(boolean looping)設置為單曲循環
isSingleLooping()檢查是否單曲循環播放
isNowPlaying()檢查是否播放
getCurrentTime()獲取當前播放位置
getDuration()獲取媒體文件總時長
getVideoWidth()獲取視頻寬度
getVideoHeight()獲取視頻高度
setPlaybackSpeed(float speed)設置播放速度
getPlaybackSpeed()獲取播放速度
setAudioStreamType(int type)設置音頻類型
getAudioStreamType()獲取音頻類型
setNextPlayer(Player next)設置當前播放結束后的下一個播放器
reset()重置播放器
release()釋放播放資源
setPlayerCallback(IPlayerCallback callback)注冊回調,接收播放器的事件通知或異常通知
② 視頻播放流程
  • 創建 Player 實例,可調用 Player(Context context),創建本地播放器,用于在本設備播放。
  • 構造數據源對象,并調用 Player 實例的 setSource(Source source) 方法,設置媒體源,代碼示例如下:
Player player = new Player(context);File file = new File("/sdcard/test_audio.mp4"); // 根據實際情況設置文件路徑FileInputStream in = new FileInputStream(file);FileDescriptor fd = in.getFD(); // 從輸入流獲取FD對象Source source = new Source(fd);player.setSource(source);
  • 調用 prepare(),準備播放。
  • (可選)構造 IPlayerCallback,IPlayerCallback 需要實現 onPlayBackComplete 和 onError(int errorType, int errorCode) 兩個方法,實現播放完成和播放異常時做相應的操作。代碼示例如下:
@Overridepublic void onPlayBackComplete() {HiLog.info(TAG, "PlayerCallback onPlayBackComplete");if (player != null) {player.stop();player = null;}}@Overridepublic void onError(int errorType, int errorCode) {HiLog.error(TAG, "PlayerCallback onError errorType: %{public}d, errorCode: %{public}d", errorType, errorCode);}
  • 調用 play() 方法,開始播放。
  • (可選)調用 pause() 方法和 play() 方法,可以實現暫停和恢復播放。
  • (可選)調用 rewindTo(long microseconds) 方法實現播放中的拖拽功能。
  • (可選)調用 getDuration() 方法和 getCurrentTime() 方法,可以實現獲取總播放時長以及當前播放位置功能。
  • 調用 stop() 方法停止播放。
  • 播放結束后,調用 release() 釋放資源。

五、視頻錄制

① 視頻錄制 API
  • 視頻錄制的主要工作是選擇視頻/音頻來源后,錄制并生成視頻/音頻文件。
  • 視頻錄制類 Recorder 的主要接口:
接口名功能描述
Recorder()創建Recorder實例
setSource(Source source)設置音視頻源
setAudioProperty(AudioProperty property)設置音頻屬性
setVideoProperty(VideoProperty property)設置視頻屬性
setStorageProperty(StorageProperty property)設置音視頻存儲屬性
prepare()準備錄制資源
start()開始錄制
stop()停止錄制
pause()暫停錄制
resume()恢復錄制
reset()重置錄制
setRecorderLocation(float latitude, float longitude)設置視頻的經緯度
setOutputFormat(int outputFormat)設置輸出文件格式
getVideoSurface()獲取視頻窗口
setRecorderProfile(RecorderProfile profile)設置媒體錄制配置信息
registerRecorderListener(IRecorderListener listener)注冊媒體錄制回調
release()釋放媒體錄制資源
② 視頻錄制流程
  • 調用 Recorder() 方法,創建 Recorder 實例。
  • 構造數據源對象,并調用 Recorder 實例的 setSource(Source source) 方法,設置媒體源,代碼示例如下:
Recorder recorder = new Recorder();Source source = new Source();source.setRecorderAudioSource(Recorder.AudioSource.DEFAULT);recorder.setSource(source);
  • 調用 setOutputFormat(int outputFormat) 方法,設置錄制文件存儲格式。
  • (可選)構造音頻屬性 AudioProperty 對象(不設置音頻則是只錄視頻),并調用 Recorder 實例的 setAudioProperty(AudioProperty property) 方法,設置錄制的音頻屬性,代碼示例如下:
final int AUDIO_NUM_CHANNELS_STEREO = 2;final int AUDIO_SAMPLE_RATE_HZ = 8000;AudioProperty audioProperty = new AudioProperty.Builder().setRecorderNumChannels(AUDIO_NUM_CHANNELS_STEREO).setRecorderSamplingRate(AUDIO_SAMPLE_RATE_HZ).setRecorderAudioEncoder(Recorder.AudioEncoder.DEFAULT).build();recorder.setAudioProperty(audioProperty);
  • 構造存儲屬性 StorageProperty 對象,并調用 Recorder 實例的 setStorageProperty(StorageProperty property) 方法,設置錄制的存儲屬性,代碼示例如下:
String path = "/sdcard/audiotestRecord.mp4";StorageProperty storageProperty = new StorageProperty.Builder().setRecorderPath(path).setRecorderMaxDurationMs(1000000) .setRecorderMaxFileSizeBytes(1000000) .build();recorder.setStorageProperty(storageProperty);
  • (可選)構造視頻屬性 VideoProperty 對象,并調用 Recorder 實例的 setVideoProperty(VideoProperty property) 方法,設置錄制的視頻屬性,代碼示例如下:
VideoProperty videoProperty = new VideoProperty.Builder().setRecorderVideoEncoder(Recorder.VideoEncoder.DEFAULT).setRecorderWidth(1080).setRecorderDegrees(0).setRecorderHeight(800).setRecorderBitRate(10000000).setRecorderRate(30).build();recorder.setVideoProperty(videoProperty);
  • 調用 prepare(),準備錄制。
  • (可選)構造錄制回調,首先構造對象 IRecorderListener,IRecorderListener 需要實現 onError(int what, int extra),實現錄制過程收到錯誤信息時做相應的操作。下面的代碼例子中錄制異常時,打印了相關的日志信息,代碼示例如下:
class RecorderErrorAndInfoListener implements IRecorderListener {@Overridepublic void onError(int what, int extra) {}@Overridepublic void onMessage(int what, int extra) {}}IRecorderListener listener = new RecorderErrorAndInfoListener() {@Overridepublic void onError(int what, int extra) {HiLog.error(TAG, "EncodeWriteFileListener onError what:%{public}d, extra:%{public}d", what, extra);}}
  • 調用 start() 方法,開始錄制。
  • (可選)調用 pause() 方法和 resume() 方法,可以實現暫停和恢復錄制。
  • 調用 stop() 方法停止錄制。
  • 錄制結束后,調用 release() 釋放資源。

六、視頻提取

① 視頻提取 API
  • 視頻提取主要工作是將多媒體文件中的音視頻數據進行分離,提取出音頻、視頻數據源。
  • 視頻提取類 Extractor 的主要接口:
接口名功能描述
Extractor()創建Extractor實例
setSource(Source source)設置媒體播放源
getStreamFormat(int id)獲取對應索引的軌道數據的格式
getTotalStreams()獲取媒體文件中總軌道數
selectStream(int id)根據軌道號選擇媒體文件中對應的軌道
unselectStream(int id)取消軌道選擇
rewindTo(long microseconds, int mode)根據時間和mode跳轉到指定幀
next()跳轉到下一幀
readBuffer(ByteBuffer buf, int offset)讀取解復用后的數據
getStreamId()獲取當前軌道號
getFrameTimestamp()獲取當前媒體數據幀的時間戳
getFrameSize()獲取當前媒體數據幀的數據大小
getFrameType()獲取當前媒體數據幀的flags
release()釋放資源
② 視頻提取流程
  • 調用 Extractor() 方法創建 Extractor 實例。
  • 構造數據源對象,并調用 Extractor 實例的 setSource(Source source) 方法,設置媒體源,代碼示例如下:
Extractor extractor = new Extractor();File file = new File("/sdcard/test_audio.mp4"); // 根據實際情況設置文件路徑FileInputStream in = new FileInputStream(file);FileDescriptor fd = in.getFD();Source source = new Source(fd);extractor.setSource(source);
  • 調用 getTotalStreams() 方法獲取媒體的軌道數量。
  • 調用 selectStream(int id) 方法選擇特定軌道的數據,進行提取。
  • (可選)調用 unselectStream(int id) 方法取消選擇軌道。
  • (可選)調用 rewindTo(long microseconds, int mode) 方法實現提取過程中的跳轉指定位置。
  • 調用 readBuffer(ByteBuffer buf, int offset) 方法,可以實現獲取提取出來的 Buffer 數據功能。
  • 調用 next() 方法,實現提取下一幀的功能。
  • (可選)調用 getMediaStreamId() 方法,可以實現獲取當前選擇的軌道編號的功能。
  • (可選)調用 getFrameTimestamp() 方法,可以實現獲取當前軌道內媒體數據幀時間戳的功能。
  • (可選)調用 getFrameSize() 方法,可以實現獲取當前軌道的媒體數據幀大小的功能。
  • (可選)調用 getFrameType() 方法,可以實現獲取當前軌道的媒體數據幀 flags 的功能。
  • 提取結束后,調用 release() 釋放資源。

七、媒體描述信息

① 媒體描述信息 API
  • 媒體描述信息主要工作是支持多媒體的相關描述信息的存取。
  • 媒體描述信息類 AVDescription 的主要接口:
接口名功能描述
getMediaId()獲取媒體標識
getTitle()獲取媒體標題
getSubTitle()獲取媒體副標題
getDescription()獲取媒體描述信息
getIcon()獲取媒體圖標
getIconUri()獲取媒體圖標的Uri
getExtras()獲取媒體添加的額外信息,例如應用和系統使用的內部信息
getMediaUri()獲取媒體內容的Uri
marshalling(Parcel parcel)將一個AVDescription對象寫入到Parcel對象
unmarshalling(Parcel parcel)將一個Parcel對象寫入到AVDescription對象
  • 媒體描述信息內部靜態類 AVDescription.Builder 的主要接口:
接口名功能描述
setMediaId(String mediaId)設置媒體標識
setTitle(CharSequence title)設置媒體標題
setSubTitle(CharSequence subTitle)設置媒體副標題
setDescription(String description)設置媒體描述信息
setIcon(PixelMap icon)設置媒體圖標
setIconUri(Uri iconUri)設置媒體圖標的Uri
setExtras(PacMap extras)設置媒體的額外信息,例如應用和系統使用的內部信息
setIMediaUri(Uri mediaUri)設置媒體的Uri
build()構造方法
② 媒體描述信息流程
  • 調用 AVDescription.Builder 類的 build 方法創建 AVDescription 實例。代碼示例如下:
AVDescription avDescription = new AVDescription.Builder().setExtras(null).setMediaId("1").setDescription("Description").setIconUri(iconUri).setIMediaUri(mediaUri).setExtras(pacMap).setIcon(pixelMap).setTitle("title").setSubTitle("subTitle").build();
  • (可選)根據已有的 AVDescription 對象,可以獲取媒體的描述信息,如獲取媒體 Uri,代碼示例如下:
Uri uri = avDescription.getMediaUri();
  • (可選)根據已有的 AVDescription 對象,可以將媒體的描述信息寫入 Parcel 對象,代碼示例如下:
Parcel parcel = Parcel.create();boolean result = avDescription.marshalling(parcel);
  • (可選)根據已有的 Parcel 對象,可以讀取到 AVDescription 對象,實現媒體描述信息的寫入,代碼示例如下:
boolean result = avDescription.unmarshalling(parcel);

八、媒體元數據

① 媒體元數據 API
  • 媒體元數據主要用于媒體數據的存放和讀取,包含諸如媒體資源的描述、創建日期、作者、封面圖片等等。
  • 媒體元數據存放類 AVMetadata.Builder 的主要接口:
接口名功能描述
Builder()媒體元數據構造器的構造函數
Builder(AVMetadata source)媒體元數據構造器的帶參構造函數
setText(String key, CharSequence value)用于存儲媒體標題等信息
setString(String key, String value)用于存儲媒體作者、藝術家、描述等
setLong(String key, long value)用于存儲媒體ID、媒體時長等信息
setPixelMap(String key, PixelMap value)用于存儲媒體元數據相關的圖片資源
build()媒體元數據生成函數
  • 媒體元數據類 AVMetadata 的主要接口:
接口名功能描述
hasKey(String key)媒體元數據中是否包含某一個key的數據
getText(String key)獲取text類型的key的數據,比如獲取媒體標題等信息
getString(String key)獲取String類型key的數據,比如獲取媒體作者、藝術家、描述等
getLong(String key)獲取Long類型key數據,比如獲取媒體ID、媒體時長等信息
getKeysSet()獲取媒體元數據的集合
getPixelMap(String key)獲取PixelMap類型key數據,獲取媒體元數據相關的圖片資源
marshalling(Parcel in)將一個AVMetadata對象寫入到Parcel對象
getAVDescription()獲取媒體的簡要描述信息
① 媒體元數據使用流程
  • 調用 AVMetadata.Builder 類的 build 方法創建 AVMetadata 實例。代碼示例如下:
AVMetadata avMetadata = new AVMetadata.Builder().setString(AVMetadata.AVTextKey.META_ID, "illuminate.mp3").setString(AVMetadata.AVTextKey.TITLE, "title").setString(AVMetadata.AVTextKey.ARTIST, "artist").setString(AVMetadata.AVTextKey.ALBUM, "album").setString(AVMetadata.AVTextKey.TITLE, "display_subtitle").setPixelMap(AVMetadata.AVPixelMapKey.ICON, pixelmap).build();
  • (可選)根據已有的 AVMetadata 對象,可以獲取媒體元數據信息,如獲取媒體標題等,代碼示例如下:
String title = avMetadata.getString(AVMetadata.AVTextKey.TITLE);
  • 我們需要結合 AVSession 使用,將已有的媒體元數據 AVMetadata 對象下發給應用,具體參考 AVSession 使用,示例如下:
mediaSession.setAVMetadata(avMetadata);
  • 應用獲取媒體元數據一般結合 AVControllerCallback 相關類使用,通過 onAVMetadataChanged 回調獲取媒體元數據。
Image musicCover;Text musicTitle;public class Callback extends AVControllerCallback {@Overridepublic void onAVMetadataChanged(AVMetadata metadata) {// 歌曲信息回調AVDescription description = metadata.getAVDescription();// 獲取標題String title = description.getTitle().toString();CharSequence sequence = metadata.getText(AVMetadata.AVTextKey.TITLE);if (sequence != null) {title = sequence.toString();}// 設置媒體titlemusicTitle.setText(title);// 獲取曲目專封面PixelMap iconPixelMap = description.getIcon();// 設置歌曲封面圖musicCover.setPixelMap(iconPixelMap);}}

總結

以上是生活随笔為你收集整理的HarmonyOS之深入解析视频的功能和使用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 日韩有码中文字幕在线观看 | 久久精品视频2 | 初尝人妻少妇中文字幕 | 亚州男人的天堂 | 亚洲不卡一区二区三区 | 欧美鲁| 欧美激情精品久久久久久免费 | 极品久久久 | 国产99久久久国产精品成人免费 | 人人插人人射 | 456亚洲影视| 日韩精品免费一区 | 亚洲一区免费在线观看 | av片在线观看 | 91av亚洲 | 成人动漫视频在线观看 | 99无码熟妇丰满人妻啪啪 | 亚洲视频在线免费 | 99国产精品国产精品九九 | 伊人艹 | 国产中文字幕在线 | 午夜精品久久久久久久96蜜桃 | 一区二区三区国产精品视频 | 都市激情 亚洲 | 国产毛片久久 | 国产伦精品一区三区精东 | 欧洲精品一区二区三区久久 | 中文字幕在线观看日本 | 国产精品99精品无码视 | 国产精品天干天干 | 在线观看免费国产视频 | 国产成人无码av在线播放dvd | 韩国妻子的朋友 | 日本男人天堂网 | 亚洲资源站 | 婷婷丁香亚洲 | 久久久1| caoprom97| 午夜影视网 | 伊人网五月天 | 91大神久久 | 亚洲AV永久无码国产精品国产 | 成人国产精品免费 | 国产成人精品视频一区二区 | 黄色网址链接 | 中文字幕在线乱 | 性感美女黄色片 | 伊人资源 | 一区二区三区四区五区在线视频 | 免费伊人 | 欧美精品一区二区三区久久久竹菊 | 综合网激情| 色婷婷综合成人av | 国产精品178页 | 污视频网站免费看 | 国产精品123区 | 在线播放一级片 | 亚洲品质自拍视频网站 | 国产乱码一区二区三区在线观看 | 成人毛片网 | 国产无遮挡又黄又爽 | 插插插网站 | 亚洲午夜影视 | 91精品国产高清一区二区三密臀 | 国产18p | 诱惑av| 91精品福利视频 | 国产无套精品 | 少妇人妻偷人精品视频蜜桃 | 91传媒入口| 久久久天堂国产精品女人 | 少妇2做爰hd韩国电影 | 久久久精品免费视频 | 国产精品第十页 | 久久亚洲精精品中文字幕早川悠里 | 四虎网站在线 | 久久精品一区二 | 成人乱码一区二区三区 | 午夜激情在线视频 | 亚洲黄色小说网 | 亚洲国产精品成人综合 | 青青草成人免费 | 97人妻精品一区二区免费 | 一区二区三区四区精品视频 | 少妇又紧又色又爽又刺激视频 | 熊猫成人网 | 欧美体内she精高潮 日韩一区免费 | 在线观看国产一区 | 日韩欧美精品中文字幕 | 调教亲女小嫩苞h文小说 | 人妻互换一二三区激情视频 | 成年人黄色录像 | 国产日韩一区二区三区在线观看 | 色啊色 | www.99re7.com | 西西444www无码大胆 | 97国产在线播放 | 国产精品毛片久久 | 亚洲一区二区三区久久 |