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

Flutter 用Texture控件在Windows平臺實(shí)現(xiàn)視頻渲染

這篇具有很好參考價值的文章主要介紹了Flutter 用Texture控件在Windows平臺實(shí)現(xiàn)視頻渲染。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報違法"按鈕提交疑問。

提示:閱讀此文章之前需要有C++開發(fā)經(jīng)驗(yàn),知道如何利用channel在C++和Dart之間做通信。

前言

一、PlatformView與Texture是什么?

二、使用步驟

1.在Flutter需要顯示視頻的地方聲明Texture組件

2.在Windows插件代碼里面創(chuàng)建TextureRenderer類

3.Flutter通過channel調(diào)用Windows插件創(chuàng)建Texture

4.Windows插件部分C++更新視頻RGBA,并通知flutter刷新界面

三、運(yùn)行效果演示

總結(jié)


前言

????????Flutter渲染視頻在移動端比較容易,可以用PlatformView,Texture等,但在Windows平臺無法使用PlatformView,原因是Windows的每一個窗口都是一個窗口句柄(HWND),如果強(qiáng)行的增加一?個PlatformView,那以后想在PlatformView所占據(jù)的位置彈出其他Flutter控件,會被遮蓋,因此Windows平臺視頻渲染只能用Texture,效率并不像網(wǎng)上提到的那么并。目前Windows平臺的示例代碼幾乎搜索不到,筆者在對接聲網(wǎng)和網(wǎng)易兩家公司RTC SDK的過程中,成功渲染了兩家公司的多媒體播放器和RTC提供的視頻,確定了Windows平臺使用Texture渲染視頻的方法,寫下此文章,希望對后來的開發(fā)者有些許幫助。


一、PlatformView與Texture是什么?

PlatformView主要適用于原生已經(jīng)很成熟的組件,嵌入到Flutter中,節(jié)省開發(fā)時間,例如WebView,視頻播放器等。由于Windows窗口機(jī)制的原因,在Windows平臺并不支持PlatformView。

Texture是一個顏色數(shù)據(jù)緩存區(qū),只要平臺將緩存區(qū)更新后,通知Flutter刷新界面即可。例如視頻渲染,只需要將當(dāng)前視頻幀的RGBA緩存區(qū)拷貝到Texture的緩存區(qū),然后Flutter刷新界面即可實(shí)現(xiàn)視頻渲染,這種方式更dart。

二、使用步驟

1.在Flutter需要顯示視頻的地方聲明Texture組件

代碼如下:

 Container(
  color: Colors.black,
    child: Texture(textureId: (widget.viewModel.textureId))
);

2.在Windows插件代碼里面創(chuàng)建TextureRenderer類

代碼如下:

class TextureRenderer {
public:
?? ?TextureRenderer(flutter::BinaryMessenger* messenger,
?? ??? ?flutter::TextureRegistrar* registrar);
bool TextureRenderer::onRenderVideoFrame(unsigned int uid, agora::media::IVideoFrameObserver::VideoFrame& videoFrame);

private:
?? ?flutter::BinaryMessenger* messenger_ = nullptr;
?? ?flutter::TextureRegistrar* registrar_ = nullptr;
?? ?std::unique_ptr<TextureRenderer> fullScreenTextureRenderer_;?? ?//全員看他紋理
?? ?std::map<int64_t, std::unique_ptr<TextureRenderer>> renderers_; //通用的直播渲染紋理

}

TextureRenderer::TextureRenderer(flutter::BinaryMessenger *messenger,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?flutter::TextureRegistrar *registrar)
? ? : registrar_(registrar),?
? ? ? texture_(PixelBufferTexture(std::bind(&TextureRenderer::CopyPixelBuffer,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? this, std::placeholders::_1,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? std::placeholders::_2))),
? ? ? uid_(0), pixel_buffer_(new FlutterDesktopPixelBuffer{nullptr, 0, 0}) {
?? ?texture_id_ = registrar->RegisterTexture(&texture_);
?? ?channel_ = std::make_unique<MethodChannel<EncodableValue>>(
? ? ? messenger,
? ? ? "strong_live_player/texture_render_" + std::to_string(texture_id_),
? ? ? &flutter::StandardMethodCodec::GetInstance());
?? ?channel_->SetMethodCallHandler([this](const auto &call, auto result) {
? ? this->HandleMethodCall(call, std::move(result));
? });
}

3.Flutter通過channel調(diào)用Windows插件創(chuàng)建Texture

Flutter層面通過channel調(diào)用C++的createTextureRender函數(shù)后,會創(chuàng)建上面提到的第二步提到的TextureRender類實(shí)例,并與第一步提到的Flutter層面的Texture控件綁定。

PlayerViewModel init(var callback) {
    AgoraMediaPlayerKit.channel.invokeMethod('createTextureRender', {
    }).then((value) {
      textureId = value;
      _channel = MethodChannel('agora_media_player_kit/texture_render_$value');
      _channel?.setMethodCallHandler(_platformCallHandler);
      callback();
      refresh();
    });
    return this;
  }

?4.Windows插件部分C++更新視頻RGBA,并通知flutter刷新界面

這一步是收到播放器的視頻幀回調(diào)后,通知Flutter層面進(jìn)行渲染。所做的工作就是把視頻幀的RGBA緩存區(qū)拷貝到Flutter底層提供的pixel_buffer。?并通知刷新,至此,視頻渲染工作完成。緩存區(qū)的大小為 視頻寬度 * 視頻高度 * 4,之所以要乘以4,是因?yàn)槊總€顏色點(diǎn)由一個32位整數(shù)組成,每個顏色點(diǎn)的每一BIT排列順序?yàn)?RGBA,分別代表紅、綠、藍(lán)、透明度,值為0~255。?代碼如下:


bool TextureRenderer::onRenderVideoFrame(unsigned int uid, agora::media::IVideoFrameObserver::VideoFrame& videoFrame)
{
	std::lock_guard<std::mutex> lock_guard(mutex_);
	if (pixel_buffer_->width != videoFrame.width ||
		pixel_buffer_->height != videoFrame.height) {
		if (pixel_buffer_->buffer) {
			delete[] pixel_buffer_->buffer;
		}
		pixel_buffer_->buffer = new uint8_t[videoFrame.width * videoFrame.height * 4];
	}
	memcpy((void*)pixel_buffer_->buffer, videoFrame.yBuffer,
		videoFrame.width * videoFrame.height * 4);
	pixel_buffer_->width = videoFrame.width;
	pixel_buffer_->height = videoFrame.height;
	registrar_->MarkTextureFrameAvailable(texture_id_);
	return true;
}

三、運(yùn)行效果演示

20220924-100136


總結(jié)

以上就是今天要講的內(nèi)容,F(xiàn)lutter在Windows上使用Texture進(jìn)行視頻渲染,對于不懂C++的人來說可能有點(diǎn)難懂。代碼只有最關(guān)鍵的部分,如果有疑問,可以回復(fù)留言交流。文章來源地址http://www.zghlxwxcb.cn/news/detail-411077.html

到了這里,關(guān)于Flutter 用Texture控件在Windows平臺實(shí)現(xiàn)視頻渲染的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • Linux平臺下基于OpenGL實(shí)現(xiàn)YUV視頻渲染

    源碼詳見https://github.com/samxfb/linux-opengl-render

    2024年01月21日
    瀏覽(24)
  • 在Winform(C++/CLR)平臺設(shè)計(jì)的(本地&在線)音樂播放器(基于WMP(Windows Media Player)控件實(shí)現(xiàn))

    在Winform(C++/CLR)平臺設(shè)計(jì)的(本地&在線)音樂播放器(基于WMP(Windows Media Player)控件實(shí)現(xiàn))

    首先,祝賀阿根廷獲得2022世界杯冠軍! Winform作為一個比較老的平臺,應(yīng)用其實(shí)越來越少了,而即使設(shè)計(jì)Winform程序,多數(shù)人也會選擇C#,而不是C++。但是題主在學(xué)校學(xué)習(xí)一門課程被迫使用了Winform/C++,并完成了課程作業(yè),在此分享以下自己的作業(yè),也當(dāng)作學(xué)習(xí)紀(jì)錄。在完成這

    2024年02月09日
    瀏覽(25)
  • 【unity shader】水體渲染基礎(chǔ)-基于texture distortion的流體流動材質(zhì)

    【unity shader】水體渲染基礎(chǔ)-基于texture distortion的流體流動材質(zhì)

    當(dāng)液體靜止時,它在視覺上與固體沒有太大區(qū)別。 但大多數(shù)時候,我們的性能不一定支持去實(shí)現(xiàn)特別復(fù)雜的水物理模擬, 需要的只是在常規(guī)的靜態(tài)材料的表面上讓其運(yùn)動起來。我們可以對網(wǎng)格的 UV 坐標(biāo)實(shí)現(xiàn)動態(tài)變化,從而讓表面的紋理效果實(shí)現(xiàn)變形的動態(tài)變化。 1.1. uv實(shí)時

    2024年02月03日
    瀏覽(28)
  • Flutter 實(shí)現(xiàn)任意控件拖動

    Flutter 實(shí)現(xiàn)任意控件拖動

    使用flutter開發(fā)是需要控件能拖動,比如畫板中的元素,或者工具條,搜索框,每個都單獨(dú)去實(shí)現(xiàn)拖動還是比較麻煩的,將拖動功能封裝成一個控件,需要的時候直接使用拖動控件作為父控件這樣就方便很多了。 使用translate變換位置即可 這一步不是必須的,但是如果需要限制

    2024年02月15日
    瀏覽(34)
  • 【Flutter】Flutter Text 控件實(shí)現(xiàn)下劃線、刪除線、虛線、加粗、斜體

    在 Flutter 開發(fā)中,我們經(jīng)常需要對 Text 控件進(jìn)行各種樣式的設(shè)置,包括但不限于下劃線、刪除線、虛線、加粗和斜體等。這些樣式的設(shè)置可以幫助我們更好地展示文本內(nèi)容,提升用戶體驗(yàn)。本文將詳細(xì)介紹如何在 Flutter 3.10.0 或更高版本中實(shí)現(xiàn)這些效果。閱讀本文后,你將掌握

    2024年02月06日
    瀏覽(18)
  • Flutter 實(shí)現(xiàn)按位置大小比例布局的控件

    Flutter 實(shí)現(xiàn)按位置大小比例布局的控件

    做視頻監(jiān)控項(xiàng)目時需要需要展示多分屏,比如2x2、3x3、414等等,如果每一種分屏都單獨(dú)實(shí)現(xiàn)會很麻煩,而且不能支持用戶定制。最好的方式還是實(shí)現(xiàn)一個通用的分屏容器,而且采樣比例計(jì)算位置大小,可以適配任意尺寸。 最直觀的實(shí)現(xiàn)方式是獲取控件寬高然后按比例計(jì)算,但

    2024年02月13日
    瀏覽(16)
  • Flutter一天一控件之ListTile(列表的實(shí)現(xiàn))

    Flutter一天一控件之ListTile(列表的實(shí)現(xiàn))

    Flutter中的ListTile控件是一種常用的列表項(xiàng)控件,它可以用于顯示列表中的每一個項(xiàng),通常包含標(biāo)題、副標(biāo)題、圖標(biāo)等內(nèi)容。ListTile控件的外觀和行為類似于Android中的ListView中的列表項(xiàng)。 上面的代碼中,我們創(chuàng)建了一個ListTile控件,包含一個左側(cè)圖標(biāo)、一個標(biāo)題、一個副標(biāo)題和

    2024年02月05日
    瀏覽(17)
  • Flutter桌面開發(fā) — Windows平臺App安裝失敗或無法運(yùn)行的問題及其解決方式

    Flutter桌面開發(fā) — Windows平臺App安裝失敗或無法運(yùn)行的問題及其解決方式

    文中所提及的問題,大多和Windows系統(tǒng)缺少Visual C++ 可再發(fā)行組件相關(guān),所以先寫怎樣安裝 Visual C++ Redistributable 即 vc_redist.exe 。 下載地址:https://www.microsoft.com/zh-CN/download/details.aspx?id=53587 點(diǎn)擊下載,然后勾選對應(yīng)的系統(tǒng),然后點(diǎn)擊next。下載完成后安裝該軟件。 錯誤描述:無法

    2024年02月04日
    瀏覽(27)
  • Android應(yīng)用-Flutter實(shí)現(xiàn)絲滑的滑動刪除、移動排序等-Dismissible控件詳解

    Android應(yīng)用-Flutter實(shí)現(xiàn)絲滑的滑動刪除、移動排序等-Dismissible控件詳解

    Dismissible 是 Flutter 中用于實(shí)現(xiàn)可滑動刪除或拖拽操作的一個有用的小部件。主要用于在用戶對列表項(xiàng)或任何其他可滑動的元素執(zhí)行刪除或拖動操作時,提供一種簡便的實(shí)現(xiàn)方式。 列表項(xiàng)刪除: 允許用戶在列表中通過滑動手勢刪除某個項(xiàng)。 左右滑動: 提供可自定義的背景,當(dāng)

    2024年02月04日
    瀏覽(23)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包