91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于FFmpeg解封裝WMV和M4V格式

OpenAtom OpenHarmony ? 來源:OpenAtom OpenHarmony ? 2026-01-21 12:57 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

開源鴻蒙具備多格式音視頻播放能力,其播放器需依次完成解協(xié)議、解封裝、解碼、渲染四大核心步驟,方可將音視頻內(nèi)容完整呈現(xiàn)給用戶;其中,解封裝作為銜接協(xié)議解析與音視頻解碼的關(guān)鍵環(huán)節(jié),具有極高的研究價值;本文將以擴展 WMV、M4V 格式解封裝能力為實踐切入點,帶大家深入熟悉開源鴻蒙的多媒體框架。

開源鴻蒙多媒體解封裝框架

1.1、HiStreamer播放器管道

播放管道構(gòu)建:框架啟動播放時,會先創(chuàng)建一條完整的播放管道,并按處理流程依次連接過濾器(Filter)、解封裝器、解碼器與渲染器,形成音視頻數(shù)據(jù)的處理鏈路;

插件加載與注冊:每個過濾器會根據(jù)待處理文件的格式,加載系統(tǒng)固定目錄下以 so 文件形式存儲的對應(yīng)插件(Plugin);插件加載完成后,會自動觸發(fā)注冊接口調(diào)用,將自身的插件描述信息(如支持的格式、處理能力等)存入框架的插件列表中;

插件匹配與任務(wù)執(zhí)行:當(dāng)具體文件開始播放時,音視頻數(shù)據(jù)會沿播放管道從左至右在各過濾器間流轉(zhuǎn)。

每個過濾器會遍歷插件列表中的描述信息,篩選并返回評分最高的插件,由該插件完成 “解協(xié)議”“解封裝”“解碼”“音視頻渲染” 等對應(yīng)處理任務(wù)。

1.2、HiStreamer解封裝插件加載流程

插件加載主體:解封裝插件的加載操作由PluginManager(插件管理器) 統(tǒng)一執(zhí)行;

擴展前置條件:若要擴展解封裝框架,首要步驟是在PluginList(插件列表) 中完成解封裝插件描述信息的注冊;

插件調(diào)度邏輯:當(dāng)音視頻數(shù)據(jù)流經(jīng)解封裝器時,框架會遍歷 PluginList 中所有已注冊的解封裝插件,最終選取評分最高的插件執(zhí)行解封裝核心任務(wù)。

開源鴻蒙擴展M4V、WMV解封裝能力

2.1、FFmpeg層擴展M4V、WMV的解封裝能力

步驟1:修改FFmpeg ohos_config.sh配置,打開M4V、WMV的解封裝能力。需要注意:M4V與MOV封裝協(xié)議一致,WMV與ASF封裝格式一致。

--enable-demuxer=mov,asf

步驟2:修改BUILD.gn,配置模塊增加ASF宏定義。

"-DCONFIG_ASF_DEMUXER","-DCONFIG_MOV_DEMUXER",

步驟3: 查看libavformat模塊MakeFile文件,確認M4V和WMV解封裝涉及的文件。

OBJS-$(CONFIGMOVDEMUXER) += mov.omov_chan.omov_esds.oqtpalette.oreplaygain.odovi_isom.o
OBJS-$(CONFIGASFDEMUXER) += asfdec_f.oasf.oasfcrypt.o asf_tags.oavlanguage.o

步驟4:打開BUILD.gn中增加WMV和M4V的文件編譯。

"http://third_party/ffmpeg/libavformat/dovi_isom.c","http://third_party/ffmpeg/libavformat/mov.c",
"http://third_party/ffmpeg/libavformat/mov_chan.c","http://third_party/ffmpeg/libavformat/mov_esds.c",
"http://third_party/ffmpeg/libavformat/movenc.c","http://third_party/ffmpeg/libavformat/qtpalette.c",
"http://third_party/ffmpeg/libavformat/replaygain.c","http://third_party/ffmpeg/libavformat/asf.c",
"http://third_party/ffmpeg/libavformat/asfcrypt.c","http://third_party/ffmpeg/libavformat/asfdec_f.c",
"http://third_party/ffmpeg/libavformat/asfdec_o.c",

2.2、 多媒體框架層擴展WMV、M4V解封裝能力

步驟1:修改PluginList,注冊WMV、M4V解封裝插件描述信息。

voidPluginList::AddMovDemuxerPlugin() {
 PluginDescription movDemuxerPlugin;
 movDemuxerPlugin.pluginName ="avdemux_mov,mp4,m4a,3gp,3g2,mj2";
 movDemuxerPlugin.packageName ="FFmpegDemuxer";
 movDemuxerPlugin.pluginType =PluginType::DEMUXER;
 movDemuxerPlugin.cap ="";
 movDemuxerPlugin.rank = DEFAULT_RANK;
 pluginDescriptionList_.push_back(movDemuxerPlugin);
}
voidPluginList::AddAsfDemuxerPlugin()
{
 PluginDescription asfDemuxerPlugin;
 asfDemuxerPlugin.pluginName ="avdemux_asf";
 asfDemuxerPlugin.packageName ="FFmpegDemuxer";
 asfDemuxerPlugin.pluginType =PluginType::DEMUXER;
 asfDemuxerPlugin.cap ="";
 asfDemuxerPlugin.rank = DEFAULT_RANK;
 pluginDescriptionList_.push_back(asfDemuxerPlugin);
}

步驟2:修改MediaType, 定義M4V和WMV的MediaType類型。

enumclassFileType: int32_t{
 M4V =111,
 WMV =112
}

步驟3:修改FFmpegFormatHelper,完善和M4V、WMV的探測邏輯。

FileTypeFFmpegFormatHelper::GetFileTypeByName(constAVFormatContext& avFormatContext) {
 FALSE_RETURN_V_MSG_E(avFormatContext.iformat != nullptr,FileType::UNKNOW,"Iformat is nullptr");
 constchar*fileName = avFormatContext.iformat->name;
 FileType fileType =FileType::UNKNOW;
 if(StartWith(fileName,"mov,mp4,m4a")) {
   if(StartWith(type->value,"m4v") ||StartWith(type->value,"M4V")) {
     fileType =FileType::M4V;
   }
 }else{
   if(g_convertFfmpegFileType.count(fileName) !=0) {
     fileType = g_convertFfmpegFileType[fileName];
   }
 }
returnfileType;
}

步驟4:修改MediaFileUtils,擴展圖庫支持M4V、WMV格式的顯示。

staticconststd::unordered_map MEDIA_MIME_TYPE_MAP = {
{"video/x-ms-asf", {"asf","asx"}
},
{"video/mp4", {"m4v","f4v","mp4v","mpeg4","mp4"}
},
}

解封裝性能優(yōu)化

3.1、 插件加載優(yōu)化

插件是以so的形式存儲到本地,起播時需要加載注冊解封裝插件,對插件做Cache處理,已加載的插件直接從內(nèi)存中獲取,防止二次加載插件耗時。

std::shared_ptrCachedPluginPackage::GetPluginDef(PluginDescriptionpluginDescription)
{
 AutoLocklock(pluginMutex);
 std::vector>::iterator itPluginPackage;
 for(itPluginPackage = pluginPackageList_.begin();
   itPluginPackage != pluginPackageList_.end(); itPluginPackage++) {
   if(*itPluginPackage ==nullptr) {
     returnnullptr;
   }
   std::vector> pluginDefList = (*itPluginPackage)->GetAllPlugins();
   std::vector>::iterator itPluginDef;
   for(itPluginDef = pluginDefList.begin(); itPluginDef != pluginDefList.end(); itPluginDef++) {
     if(*itPluginDef ==nullptr) {
       returnnullptr;
     }
     if(strcmp((*itPluginDef)->name.c_str(), pluginDescription.pluginName.c_str()) ==0) {
       return(*itPluginDef);
     }
   }
 }
 std::shared_ptr pluginPackage = std::make_shared();
 boolret = pluginPackage->LoadPluginPackage(pluginDescription.packageName);
 if(!ret) {
   returnnullptr;
 }
 pluginPackageList_.push_back(pluginPackage);
 std::vector> pluginDefList = pluginPackage->GetAllPlugins();
 std::vector>::iterator itPluginDef;
 for(itPluginDef = pluginDefList.begin(); itPluginDef != pluginDefList.end(); itPluginDef++) {
   if(*itPluginDef ==nullptr) {
     returnnullptr;
   }
   if(strcmp((*itPluginDef)->name.c_str(), pluginDescription.pluginName.c_str()) ==0) {
     return(*itPluginDef);
   }
 }
 returnnullptr;
}

3.2、探測遍歷優(yōu)化

文件格式探測時,會遍歷所有的demuxer,找出評分最高的demuxer,F(xiàn)Fmpeg本身支持的demuxer比較多,限定探索范圍為PluginList中已注冊的demuxer, 可以加快起播速度。

std::stringPluginManagerV2::SnifferPlugin(PluginTypepluginType, std::shared_ptrdataSource)
{
 MEDIA_LOG_I("SnifferPlugin pluginType: "PUBLIC_LOG_D32, pluginType);
 std::vectormatchedPluginsDescriptions =
   PluginList::GetInstance().GetPluginsByType(pluginType);
 int maxProb =0;
 std::iterator it;
 PluginDescriptionbestMatchedPlugin;
for(it = matchedPluginsDescriptions.begin(); it != matchedPluginsDescriptions.end(); it++) {
   std::shared_ptrpluginDef = cachedPluginPackage_->GetPluginDef(*it);
   if(pluginDef != nullptr) {
     auto prob = pluginDef->GetSniffer()(pluginDef->name, dataSource);
     if(prob > maxProb) {
       maxProb = prob;
       bestMatchedPlugin = (*it);
     }
   }
 }
 returnbestMatchedPlugin.pluginName;
}

3.3、 限定探測文件大小

文件格式探測時,需要讀取文件,然后解析相應(yīng)的屬性,并限定sniff的大小,防止過多讀取導(dǎo)致的起播延時和內(nèi)存開銷。

intSniff(conststd::string& pluginName, std::shared_ptr dataSource)
{
 FALSE_RETURN_V_MSG_E(!pluginName.empty(),0,"Plugin name is empty");
 FALSE_RETURN_V_MSG_E(dataSource !=nullptr,0,"DataSource is nullptr");
 returnSniffWithSize(pluginName, dataSource, DEFAULT_SNIFF_SIZE);
}

3.4、 優(yōu)化丟幀邏輯

目前的丟幀邏輯:HiStreamer管道有音畫同步邏輯,音頻管道解析較快,在sink階段,會丟棄超時的渲染幀,這種丟幀邏輯其實無法提高解碼和解封裝的性能。

優(yōu)化后的丟幀邏輯:在管道的Demuxer階段,當(dāng)探測到視頻幀延時,丟棄非參考幀,提升視頻管道的速度。

3.5、 優(yōu)化內(nèi)存

步驟一、HiStreamer管道中不同插件傳遞Buffer數(shù)據(jù)時使用共享內(nèi)存, 減少幀復(fù)制。

步驟二、建立內(nèi)存池,循環(huán)使用已分配好的內(nèi)存,減少內(nèi)存創(chuàng)建耗時。

步驟三、Demuxer解析后的數(shù)據(jù)直接放入解碼器內(nèi)存,不進行復(fù)制,減少耗時。

解封裝能力測試

4.1 設(shè)計測試用例

用思維導(dǎo)圖整理要測試的邏輯。

4.2 編寫測試用例

步驟1、首先準備測試文件,使用FFMpeg探測文件中的幀數(shù)和關(guān)鍵幀。

執(zhí)行ffprobe命令,獲取總幀數(shù)2641。

ffprobe-verror-select_streams v:0-count_frames -show_entries stream=nb_read_frames wmv_wmv3_no.wmv

執(zhí)行ffprobe命令,獲取關(guān)鍵幀數(shù)為68。

ffprobe-loglevelerror-select_streams v:0-show_frames -show_entries frame=pict_type wmv_wmv3_no.wmv | grep -c pict_type=I

步驟2、打開avcodec工程,在unitest/demuxer_test目錄單獨創(chuàng)建m4v和wmv的單元測試文件, 編寫測試用例。

HWTEST_F(DemuxerUnitTest,Demuxer_WMV_ReadSample_0001,TestSize.Level1)
{
 InitResource(g_wmvPath,LOCAL);
ASSERTTRUE(initStatus);
 ASSERT_EQ(demuxer_->SelectTrackByID(0),AV_ERR_OK);
 sharedMem_=AVMemoryMockFactory::CreateAVMemoryMock(bufferSize);
 ASSERT_NE(sharedMem_, nullptr);
 ASSERT_TRUE(SetInitValue());
 while(!isEOS(eosFlag)){
 for(autoidx:selectedTrackIds){
     ASSERT_EQ(demuxer_->ReadSample(idx,sharedMem,&info,flag),AV_ERR_OK);
     CountFrames(idx);
   }
 }
 printf("frames_[0]=%d | kFrames[0]=%d
", frames_[0], keyFrames_[0]);
ASSERTEQ(frames[0],2641);
ASSERTEQ(keyFrames[0],68);
 RemoveValue();
}

4.3 編譯運行測試用例

步驟1、編譯測試用例。

./build.sh --product-name rk3568 --ccache -fast-rebuild --build-target=demuxer_native_module_test

步驟2、生成產(chǎn)物推入板卡/bin目錄。

rhdc shell mount -o remount,rw /
rhdc file send E:sharedemuxer_native_module_test /bin/

步驟3、將資源文件推入板卡。

rhdc file sendtest/moduletest/resources/demuxer data/test/media/

步驟4、執(zhí)行測試用例。

demuxer_native_module_test--gtest_filter=Demuxer3gpFuncNdkTest.*
demuxer_native_module_test --gtest_filter=Demuxer3G2FuncNdkTest.*
demuxer_native_module_test --gtest_filter=DemuxerM4vFuncNdkTest.*
demuxer_native_module_test --gtest_filter=DemuxerWmvFuncNdkTest.*
demuxer_native_module_test --gtest_filter=DemuxerVobFuncNdkTest.*

總結(jié)

通過以上內(nèi)容,不僅能幫助開發(fā)者深入理解開源鴻蒙多媒體框架的運行邏輯,熟練掌握多媒體解封裝能力的擴展方法;還能針對解封裝環(huán)節(jié)進行性能調(diào)優(yōu),并通過編寫單元測試用例,從功能與性能雙重維度,保障了解封裝模塊的魯棒性與高效性。

供稿:李曉飛、傅巧妮、魏宏亮

責(zé)編:開發(fā)者與活動運營組 李健

編審:品牌管理組 麗娜

審核:開源鴻蒙項目群工作委員會執(zhí)行總監(jiān) 陶銘

開源鴻蒙項目群工作委員會執(zhí)行秘書 曹云菲

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 封裝
    +關(guān)注

    關(guān)注

    128

    文章

    9248

    瀏覽量

    148610
  • 音視頻
    +關(guān)注

    關(guān)注

    4

    文章

    593

    瀏覽量

    31370
  • 開源
    +關(guān)注

    關(guān)注

    3

    文章

    4203

    瀏覽量

    46122
  • 鴻蒙
    +關(guān)注

    關(guān)注

    60

    文章

    2963

    瀏覽量

    45883

原文標題:拆·應(yīng)用 | 第九期:基于FFmpeg解封裝WMV和M4V格式

文章出處:【微信號:gh_e4f28cfa3159,微信公眾號:OpenAtom OpenHarmony】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    《深入理解FFmpeg閱讀體驗》FFmpeg攝像頭測試

    0% /dev/shm tmpfs 763.8M 184.0K 763.7M0% /tmp tmpfs 763.8M 468.0K 763.4M0% /run 然后測試下
    發(fā)表于 04-17 19:06

    專門錄制屏幕動作的工具

    M4V、CAMV、MOV、RM、GIF 動畫等多種常見格式,是制作視頻演示的絕佳工具。 下載地址 :專門錄制屏幕動作的工具 [此貼子已經(jīng)被admin于2009-10-24 9:17:08編輯過]
    發(fā)表于 06-09 14:27

    ti8168 rdk mpeg4 解碼異常

    ffmpeg的解碼命令為: ffplay -i m4v -f ?in_mp4_err2.mpg4,可以正常解碼播放。 這個問題該如何解決?
    發(fā)表于 05-31 06:41

    怎么使用ffmpeg控制視頻輸出p格式(1080p50)或者i格式(1080i50)?

    我在使用ffmpeg指令接收udp視頻流,然后通過blackmagic設(shè)備的SDI接口輸出到顯示器顯示,但是視頻默認是p格式的,我用-format_code Hi50設(shè)置視頻格式為50i,參數(shù)沒有
    發(fā)表于 08-07 09:05

    MK20DX256VLL10解封裝測試失敗/假冒嫌疑是什么意思?

    我們一直在拼命地通過經(jīng)紀人找到一批 KINETIS ARM Cortex M4,確切代碼 MK20DX256VLL10。官方經(jīng)銷商缺貨。由于解封裝測試存在問題,測試實驗室向我們發(fā)送了一份結(jié)果為“失敗
    發(fā)表于 03-15 07:23

    怎樣查詢在FFMPEG中所有被支持的bm hardware decoder?

    root ffmpeg -decoders | grep _bm V….. avs_bm bm AVS decoder wrapper (codec avs) V….. cavs_bm bm
    發(fā)表于 09-19 07:37

    M4V系列圖示面板表的介紹

    M4V系列W75H25mm馬賽克控制器專用圖示面板表的特點:各種DC輸入功能:0-2VDC,0-10VDC,1-5VDC,DC0-1mA,DC4-20mA、預(yù)設(shè)功能(High/Low縮放設(shè)定)、最大顯示:-999~9999、錯誤顯示功能和自診斷功能、內(nèi)置高品質(zhì)的微處理器。
    發(fā)表于 09-28 17:01 ?1次下載
    <b class='flag-5'>M4V</b>系列圖示面板表的介紹

    視頻的編碼和格式的詳細資料說明

    第一, AVI, WMV, MP4, MOV, MKV等等, 通通都是封裝(即文件名),不是真正的格式。真正的格式取決于視頻壓縮編碼。常用的
    發(fā)表于 01-09 08:00 ?47次下載
    視頻的編碼和<b class='flag-5'>格式</b>的詳細資料說明

    2種將DAT轉(zhuǎn)換為MP4WMV,MOV(QuickTime)的實用方法

    解決您的問題,您需要在Windows和Mac上將DAT視頻轉(zhuǎn)換為MP4WMV,MOV(QuickTime)和大多數(shù)其他流行的標準視頻格式。本文將推薦一款出色的DAT視頻轉(zhuǎn)換器,以及在線和免費方法,可以
    的頭像 發(fā)表于 12-08 11:39 ?2.3w次閱讀

    M4V編輯器:如何在Windows/Mac上輕松編輯M4V文件

    要裁剪M4V視頻中不需要的部分、設(shè)置邊框、添加特殊效果并自定義以創(chuàng)建個人視頻,您需要一個功能豐富的M4V編輯器。專業(yè)的視頻編輯工具將幫助您快速和直觀地編輯M4V文件,在本文中,您可以了解iTunes
    的頭像 發(fā)表于 01-14 09:19 ?4762次閱讀

    漲知識~Windows/Mac上推薦的11款WMV播放器

    WMV是最古老的數(shù)字視頻格式之一。然而,盡管有許多開發(fā)出來的格式,但是WMV始終擁有著區(qū)別于其他格式的眾多優(yōu)勢。這也使得它至今仍被不少用戶選
    的頭像 發(fā)表于 01-14 15:28 ?3642次閱讀

    FFmpeg 6.0 發(fā)布

    FFmpeg 6.0 中新的解碼器包括有 Bonk、RKA、Radiance、SC-4、APAC、VQC、WavArc 和一些 ADPCM 格式,且 QSV 和 NVenc 現(xiàn)在支持 AV1 編碼。
    的頭像 發(fā)表于 03-06 09:55 ?1814次閱讀

    Pydub:一個基于ffmpeg的Python音頻處理模塊

    Pydub是一個基于ffmpeg的Python音頻處理模塊,封裝了許多ffmpeg底層接口,因此用它來做音樂歌曲文件格式轉(zhuǎn)換會非常方便。 如果你閱讀過我們之前的文章:《 剪輯音樂要很久
    的頭像 發(fā)表于 10-21 10:40 ?3378次閱讀

    Pydub音樂文件格式轉(zhuǎn)換功能介紹

    Pydub是一個基于ffmpeg的Python音頻處理模塊,封裝了許多ffmpeg底層接口,因此用它來做音樂歌曲文件格式轉(zhuǎn)換會非常方便。 如果你閱讀過我們之前的文章:《 剪輯音樂要很久
    的頭像 發(fā)表于 10-31 14:51 ?1901次閱讀

    如何基于FFmpeg解碼WMV3視頻

    在音視頻開發(fā)的世界里,WMV3 就像一位沉靜的老友——它曾是 Windows Media 時代的主角,如今雖已淡出主流視野,卻仍在企業(yè)錄像、歷史資料、監(jiān)控存檔中默默守候;而 FFmpeg,這位開源世界的“瑞士軍刀”,正是我們與這位老友對話的最佳翻譯官。
    的頭像 發(fā)表于 12-25 09:29 ?334次閱讀
    如何基于<b class='flag-5'>FFmpeg</b>解碼<b class='flag-5'>WMV</b>3視頻