Error message here!

Hide Error message here!

忘记密码?

Error message here!

请输入正确邮箱

Hide Error message here!

密码丢失?请输入您的电子邮件地址。您将收到一个重设密码链接。

Error message here!

返回登录

Close

低分辨率刷視頻看了個寂寞?華為HMS Core超分辨率功能助您一招提昇用戶體驗

第三女神程憶難 2021-09-26 06:08:42 阅读数:46 评论数:0 点赞数:0 收藏数:0

 “社畜”的手機視頻體驗

作為一名社畜,白天要把時間獻給代碼,晚上要把時間獻給家庭,真正屬於自己的時間,算來算去也只有每天搭乘公共交通的通勤時間能够自由支配。不過,因為身處車厢哪也去不了,這種自由也僅限於掏出手機刷哪部劇,看哪個直播而已。

但即便是這僅有的一點休閑,我們也只能看超低分辨率、超卡頓的視頻。原因無他,地鐵信號實在、實在太差了!

就拿我現在都沒看全的幾個奧運大項决賽來說,在信號不好的公交或地鐵上看比賽,開低分辨率是保持流暢的唯一方法。但在低分辨率下看比賽,你既看不見球在哪,也分不清誰是誰;基本等於看了個寂寞。

如果分辨率太低,在乒乓球、網球這樣的小球比賽裏,兩個運動員就像在隔空做廣播體操,完全看不見球在哪;在足球、排球、網球這樣的團隊競技中,也完全看不出來同一個隊裏誰是誰;而在跳水這樣的項目中,每個人入水都沒什麼水花,都是9.5水平……

那麼,面對此起彼伏的視頻內容風口,除了指望運營商能多建幾個基站之外,作為開發者,我們有什麼能做的嗎?

答案很簡單,視頻超分辨率!


超分辨率,過去很複雜,現在很簡單

在GitHub上隨手一搜,我們就能看到數千個與超分辨率相關的項目,其中還有不少經常維護的技術合集,可以說是百花齊放。不過真到了實踐階段,你就會發現,這些開源項目不僅需要很多DL方面的框架知識,集成到項目中也是非常麻煩的事情。缺少相關技術大牛的小團隊想要搞定視頻超分,別說趕眼前的內容風口了,能趕下半年的內容風口就不錯了。

不過最近,華為HMS Core 6.0全球上線,其新推出的多媒體管線服務(AV Pipeline Kit,簡稱AV Pipeline)中,提供了視頻超分插件。開發者只需將AV Pipeline的SDK集成到自己的視頻播放器應用中並完成UI的適配便可實現視頻超分功能。

 AV Pipeline框架支持在播放過程中進行視頻的逐幀超分。而除視頻播放Pipeline的插件外,還包含視頻超分插件CVFilter。編排關系如上圖所示。

話不多說,我們來實戰:


1 開發准備

1.1 新建Android Studio工程,修改工程級build.gradle文件,在“allprojects > repositories”裏面增加華為的Maven倉地址。

allprojects {
repositories {
google()
jcenter()
maven {url 'https://developer.huawei.com/repo/'}
}
}

1.2 打開項目中應用級的“build.gradle”文件。在dependencies中添加編譯依賴。

dependencies {
...
implementation 'com.huawei.hms:avpipelinesdk:6.0.0.302'
implementation 'com.huawei.hms:avpipeline-aidl:6.0.0.302'
implementation 'com.huawei.hms:avpipeline-fallback-base:6.0.0.302'
implementation 'com.huawei.hms:avpipeline-fallback-cvfoundry:6.0.0.302'
}

1.3 在完成以上的配置後,點擊工具欄中的gradle同步圖標,完成“build.gradle”文件的
同步,將相關依賴下載到本地。


2 開發步驟

2.1 動態申請存儲權限

private void handlePermission() {
String[] permissionLists = {
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.ACCESS_NETWORK_STATE
};
int requestPermissionCode = 1;
for (String permission : permissionLists) {
if (ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, permissionLists, requestPermissionCode);
}
}
}

2.2 初始化AV Pipeline框架。

private void initFwk() {
if (AVPLoader.isInit()) {
Log.d(TAG, "avp framework already inited");
return;
}
boolean ret = AVPLoader.initFwk(getApplicationContext());
if (ret) {
makeToastAndRecordLog(Log.INFO, "avp framework load succ");
} else {
makeToastAndRecordLog(Log.ERROR, "avp framework load failed");
}
}

2.3 創建MediaPlayer實例。播放過程的控制由該實例來完成。

//創建MediaPlayer實例
mPlayer = MediaPlayer.create(MediaPlayer.PLAYER_TYPE_AV);

2.4 設置graph配置文件。AV Pipeline框架依賴於該配置文件來編排各個插件。此外還需要將MEDIA_ENABLE_CV的值設置為1,激活視頻超分插件。

protected void setGraph() {
String path = getExternalFilesDir(null).getPath() + "/PlayerGraphCV.xml";
MediaMeta meta = new MediaMeta();
meta.setString(MediaMeta.MEDIA_GRAPH_PATH, path);
meta.setInt32(MediaMeta.MEDIA_ENABLE_CV, 1);
mPlayer.setParameter(meta);
}

2.5 以下為視頻超分Pipeline的graph配置文件PlayerGraphCV.xml。

<?xml version="1.0"?>
<Nodes>
<node id="0" name="AVDemuxer" mime="media/demuxer" type="source">
<!-- 數據流從這裏開始分兩路,一路到視頻解碼節點node 1,一路到音頻解碼節點node 2 -->
<next id="1"/>
<next id="2"/>
</node>
<!-- 視頻解碼節點將解碼後的圖像送到下一個節點,即next id號對應的3號CVFilter節點 -->
<node id="1" name="MediaCodecDecoder" mime="video/avc" type="filter">
<next id="3"/>
</node>
<!-- 音頻解碼節點將解碼後的音頻送到下一個節點,即next id號對應的4號AudioSinkOpenSL節點 -->
<node id="2" name="FFmpegNode" mime="audio/aac" type="filter">
<next id="4"/>
</node>
<!-- node的name、mime、type參考示例中的定義。node id應當唯一,建議為上一個node id加1即可 -->
<node id="3" name="CVFilter" mime="video/cv-filter" type="filter">
<!-- next id為視頻流從本節點出去後需要到達的下一個節點,本示例中為送顯節點 -->
<next id="5" />
</node>
<node id="4" name="AudioSinkOpenSL" mime="audio/sink" type="sink">
</node>
<node id="5" name="VideoSinkBasic" mime="video/sink" type="sink">
</node>
</Nodes>

2.6 設置以下參數後調用prepare接口,啟動MediaPlayer准備工作。

//創建MediaPlayer實例
mPlayer = MediaPlayer.create(MediaPlayer.PLAYER_TYPE_AV);
if (mPlayer == null) {
return;
}
//設置graph配置文件
setGraph();
if (getPlayerType() == MediaPlayer.PLAYER_TYPE_AV) {
// 設置視頻渲染的surface
SurfaceView mSurfaceVideo = findViewById(R.id.surfaceViewup);
SurfaceHolder mVideoHolder = mSurfaceVideo.getHolder();
int ret = mPlayer.setVideoDisplay(mVideoHolder.getSurface());
if (ret != 0) {
makeToastAndRecordLog(Log.ERROR, "setVideoDisplay failed, ret=" + ret);
return;
}
}
// 設置待播放媒體文件的路徑
int ret = mPlayer.setDataSource(mFilePath);
if (ret != 0) {
makeToastAndRecordLog(Log.ERROR, "setDataSource failed, ret=" + ret);
return;
}
//啟動MediaPlayer准備工作
mPlayer.prepare();

2.7 調用start開始播放

mPlayer.start();

2.8 停止播放和銷毀播放器

mPlayer.stop();
mPlayer.reset();
mPlayer.release();
mPlayer = null;

視頻超分辨率效果對比

在AV Pipeline的demo中我們可以看到,在開啟超分辨率後,畫質、色彩和亮度均獲得了不同程度的提昇,觀看體驗提昇還是比較明顯的。而最重要的是,相對於其他超分辨率實現手段,通過調用HMS Core的方法實現超分非常簡單。這相當於以很低的開發成本給你的視頻應用帶來體驗的大幅昇級;何樂而不為?


HMS Core與未來

HMS Core是華為軟硬件開放能力的合集,其目的在於幫助應用開發者簡化開發流程,讓APP能够以更簡單、更高效、更低成本的方式完成功能開發,為盡可能多的最終用戶提供優秀且一致的應用體驗。

從最初的帳號、支付、推送服務一路走來,目前的HMS Core 6.0已經能够提供應用服務、AI、媒體、智能設備連接、圖形、安全和連接通信等七大類、幾十種開放能力和數百種功能。從用戶登錄、廣告推送,到圖形渲染、機器學習、音視頻編輯,再到5G、網絡聚合、NFC……HMS Core用龐大的代碼庫為開發者提供了構建APP所需的各類功能模塊。利用HMS Core,開發者要做的便是展開想象力,用無數塊“積木”搭建出屬於自己的App城堡並開始運營。可以說HMS Core不僅降低了移動App開發的門檻,也提昇了開發的敏捷性和上限。

華為不僅維護了全球數百萬開發者參與的社區,更在gitee、GitHub上有海量的代碼庫和demo可供參考。無論大團隊、小團隊還是個人都可以通過調用HMS Core獲得開發上的便利。

另一方面,面向手機、智能終端和物聯網設備的HarmonyOS在上線後的短短一個多月時間內便迅速在全球迅速積累了數千萬用戶和設備,並擁有數十家重量級設備合作夥伴。在這一全新OS生態中的布局是App提供新體驗、獲得新用戶的重要途徑。HMS生態是運行在操作系統之上的應用和服務生態,可運行在HarmonyOS上。現有Android應用已經使用了HMS Core的能力可在HarmonyOS可以繼續使用,這很大降低了開發者進入HarmonyOS生態的門檻,並讓多版本App的維護變得异常簡單。 

更簡便的開發、更全面的功能、更好的體驗,外加更龐大的生態……好東西分享完了,我去給兒子當家教去了ToT

版权声明
本文为[第三女神程憶難]所创,转载请带上原文链接,感谢

编程之旅,人生之路,不止于编程,还有诗和远方。
阅代码原理,看框架知识,学企业实践;
赏诗词,读日记,踏人生之路,观世界之行;

支付宝红包,每日可领