千呼萬(wàn)喚始出來(lái),在OpenHarmony最新發(fā)布的3.1版本中終于支持了suRFace+videoplayer實(shí)現(xiàn)視頻播放的功能。
1. surface+videoplayer視頻播放與傳統(tǒng)的video組件對(duì)比
大家可能覺(jué)得不是很早就支持一個(gè)video組件就可以實(shí)現(xiàn)視頻播放嗎?是的,video組件也就簡(jiǎn)簡(jiǎn)單單能做個(gè)視頻播放,而你仔細(xì)去查閱下,video組件支持的api功能太少了,很多定制化功能都無(wú)法實(shí)現(xiàn)。下面是3.1版本上video組件所具備的api:
而在3.1中添加了一個(gè)關(guān)鍵組件就是xcomponent,它可以設(shè)置一個(gè)type為surface,而我更關(guān)心的就是這個(gè)surface,在講surface之前我先講講videoplayer。
3.1版本中同時(shí)還新增了視頻播放的媒體服務(wù)videoplayer,它為我們提供了視頻播放服務(wù)相關(guān)的各種api,video組件所具備的功能它全部具備,同時(shí)還具備視頻首幀送顯上報(bào)事件、監(jiān)聽(tīng)視頻播放寬高變化事件、監(jiān)聽(tīng)視頻緩存更新事件等等高級(jí)功能,這樣就可以幫助我們自定義出非常高級(jí)的視頻播放器出來(lái)了。
而videoplayer它只是個(gè)做視頻播放的媒體服務(wù),它并不能直接項(xiàng)video組件那樣輸出視頻顯示在顯示器上,這個(gè)時(shí)候就需要借助surface了。Surface可以簡(jiǎn)單的理解為繪制時(shí)用的畫(huà)布,在hml布局文件中添加一個(gè)xcomponent組件并設(shè)置type為surface,就相當(dāng)于放置了一塊畫(huà)布。而surface在程序中可以抽象為一塊內(nèi)存,在js代碼中xcomponent組件通過(guò)調(diào)用getXComponentSurfaceId()方法可以申請(qǐng)這塊內(nèi)存,然后就可以隨意的繪制,videoplayer在完成視頻的編解碼服務(wù)之后,可以通過(guò)調(diào)用setdisplaySurface這個(gè)方法將視頻內(nèi)容輸出到之前的surface內(nèi)存中,從而達(dá)到最終視頻在窗口上顯示的功能。下圖是基本架構(gòu)圖
2. surface+videoplayer視頻播放代碼實(shí)現(xiàn)
下面只實(shí)現(xiàn)一個(gè)最基礎(chǔ)的視頻播放功能,首先是編寫(xiě)hml布局文件,代碼如下:
(左右移動(dòng)查看全部?jī)?nèi)容)
然后編寫(xiě)js文件,代碼如下:
import media from '@ohos.multimedia.media'
import fileIO from '@ohos.fileio'
let videoPlayer = undefined;
let surfaceID = undefined; // 用于保存Xcomponent接口返回的surfaceID
export default {
data: {
title: ""
},
onInit() {
},
// 調(diào)用Xcomponent的接口用于獲取surfaceID,并保存在surfaceID變量中,該接口由XComponent組件默認(rèn)加載,非主動(dòng)調(diào)用
async LoadXcomponent() {
surfaceID = this.$element('Xcomponent').getXComponentSurfaceId();
console.info('LoadXcomponent surfaceID is' + surfaceID);
// 用戶(hù)選擇視頻設(shè)置fd(本地播放)
let fdPath = 'fd://';
// path路徑的碼流可通過(guò)"hdc file send D:xxx1.mp3 /data/accounts/account_0/appdata" 命令,將其推送到設(shè)備上
let path = '/data/accounts/account_0/appdata/1.mp4';
await fileIO.open(path).then(fdNumber => {
fdPath = fdPath + '' + fdNumber;
console.info('open fd sucess fd is' + fdPath);
}, err => {
console.info('open fd failed err is' + err);
});
await media.createVideoPlayer().then((video) => {
if (typeof (video) != 'undefined') {
videoPlayer = video;
console.info('video createVideoPlayer success');
} else {
console.info('video createVideoPlayer fail');
}
}).catch((error) => {
console.info(`video catchCallback, error:${error.message}`);
});
videoPlayer.url = fdPath;
console.info('video url success');
// 設(shè)置surfaceID用于顯示視頻畫(huà)面
await videoPlayer.setDisplaySurface(surfaceID).then(() => {
console.info('setDisplaySurface success');
}).catch((error) => {
console.info(`video catchCallback, error:${error.message}`);
});
// 調(diào)用prepare完成播放前準(zhǔn)備工作
await videoPlayer.prepare().then(() => {
console.info('prepare success');
}).catch((error) => {
console.info(`video catchCallback, error:${error.message}`);
});
// 調(diào)用play開(kāi)始播放
await videoPlayer.play().then(() => {
console.info('play success');
}).catch((error) => {
console.info(`video catchCallback, error:${error.message}`);
});
},
}
(左右移動(dòng)查看全部?jī)?nèi)容)
原文標(biāo)題:OpenHarmony 3.1 新特性:surface+videoplayer 實(shí)現(xiàn)視頻播放
文章出處:【微信公眾號(hào):HarmonyOS官方合作社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
-
Video
+關(guān)注
關(guān)注
0文章
195瀏覽量
45144 -
視頻播放
+關(guān)注
關(guān)注
0文章
10瀏覽量
6746 -
OpenHarmony
+關(guān)注
關(guān)注
25文章
3635瀏覽量
16061
原文標(biāo)題:OpenHarmony 3.1 新特性:surface+videoplayer 實(shí)現(xiàn)視頻播放
文章出處:【微信號(hào):HarmonyOS_Community,微信公眾號(hào):電子發(fā)燒友開(kāi)源社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論