chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

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

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

如何基于FFmpeg解碼WMV3視頻

OpenAtom OpenHarmony ? 來源:OpenAtom OpenHarmony ? 2025-12-25 09:29 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

【拆·應(yīng)用】是為開源鴻蒙應(yīng)用開發(fā)者打造的技術(shù)分享平臺,是匯聚開發(fā)者的技術(shù)洞見與實踐經(jīng)驗、提供開發(fā)心得與創(chuàng)新成果的展示窗口。誠邀您踴躍發(fā)聲,期待您的真知灼見與技術(shù)火花!

引言

在音視頻開發(fā)的世界里,WMV3 就像一位沉靜的老友——它曾是 Windows Media 時代的主角,如今雖已淡出主流視野,卻仍在企業(yè)錄像、歷史資料、監(jiān)控存檔中默默守候;而 FFmpeg,這位開源世界的“瑞士軍刀”,正是我們與這位老友對話的最佳翻譯官。

今天,我們就用 FFmpeg4.x版本,把一段 WMV3 編碼的視頻,從一串二進(jìn)制數(shù)據(jù),還原成有溫度的畫面。

解碼的本質(zhì):從“密碼本”到“像素畫”

WMV3 是 VC-1 標(biāo)準(zhǔn)(SMPTE 421M)的一種實現(xiàn),屬于微軟在 2003 年推出的高效視頻編碼格式。它支持 I/P/B 幀結(jié)構(gòu)、可變量化、環(huán)路濾波等特性,畫質(zhì)在當(dāng)時堪稱先進(jìn)。

但在 FFmpeg 眼中,WMV3 并沒有獨立的解碼器 ID——它被統(tǒng)一歸入 AV_CODEC_ID_VC1,這是很多開發(fā)者踩坑的第一步。

正確做法:
不要找 AV_CODEC_ID_WMV3(它不存在?。?br /> 而是使用:

constAVCodec*codec = avcodec_find_decoder(AV_CODEC_ID_VC1);

分三步走:讓 FFmpeg “讀懂” WMV3

解碼 WMV3 與解碼 H.264 流程高度相似,核心在于正確初始化上下文并喂入完整數(shù)據(jù)。視頻解碼處理關(guān)鍵流程圖如下:

0a969136-dbfb-11f0-8c8f-92fbcf53809c.png

以下是精簡但可運(yùn)行的關(guān)鍵步驟:

1:打開文件,找到視頻流

AVFormatContext*fmt_ctx =NULL;
avformat_open_input(&fmt_ctx,"video.wmv",NULL,NULL);
avformat_find_stream_info(fmt_ctx,NULL);// 必須調(diào)用!解析容器頭
intvideo_stream =-1;
for(inti =0; i < fmt_ctx->nb_streams; i++) {
 if(fmt_ctx->streams[i]->codecpar->codec_type ==AVMEDIA_TYPE_VIDEO) {
    video_stream = i;
   break;
  }
}

2:創(chuàng)建 VC-1 解碼器上下文

AVCodecParameters*par = fmt_ctx->streams[video_stream]->codecpar;
// 關(guān)鍵:WMV3 使用 VC1 解碼器
constAVCodec*codec = avcodec_find_decoder(AV_CODEC_ID_VC1);
if(!codec) {
  fprintf(stderr,"錯誤:FFmpeg 未編譯 VC1 解碼器!
");
 return-1;
}
AVCodecContext*dec_ctx = avcodec_alloc_context3(codec);
avcodec_parameters_to_context(dec_ctx, par);// 將流參數(shù)傳給解碼器
if(avcodec_open2(dec_ctx, codec,NULL) 

3:循環(huán)解碼:數(shù)據(jù)包 → 幀

AVPacket*pkt = av_packet_alloc();
AVFrame*frame = av_frame_alloc();
while(av_read_frame(fmt_ctx, pkt) >=0) {
 if(pkt->stream_index == video_stream) {
    avcodec_send_packet(dec_ctx, pkt);
   while(avcodec_receive_frame(dec_ctx, frame) ==0) {
     // 此時 frame 已解碼成功!可渲染、轉(zhuǎn)存或分析
      process_frame(frame);
    }
  }
  av_packet_unref(pkt);
}
// 別忘了清理
av_frame_free(&frame);
av_packet_free(&pkt);
avcodec_free_context(&dec_ctx);
avformat_close_input(&fmt_ctx);

注意: WMV3 常封裝在 ASF 容器(.wmv 文件)中,F(xiàn)Fmpeg 的 avformat_find_stream_info 會自動解析容器并提取出 VC-1 碼流。

實戰(zhàn)避坑:那些“看似正常卻解不了”的陷阱

問題1: avcodec_find_decoder 返回 NULL


原因:FFmpeg 編譯時未啟用 VC-1 解碼器。
驗證方法:

ffmpeg-codecs | grep vc1

若無輸出,說明不支持。

解決方案:

使用官方完整版 FFmpeg(如 ffmpeg-full);

或自行編譯時添加:

./configure   --enable-decoder=vc1 --enable-parser=vc1

問題2: 畫面花屏、綠塊、卡死在第一幀

原因:WMV3 碼流缺少“序列頭”(Sequence Header)。
VC-1 解碼器需要這段元數(shù)據(jù)才能正確初始化量化表、幀尺寸等參數(shù)。而某些 WMV 文件(尤其截斷或錄制不完整)會丟失它。

解決策略:

方案一:用 FFmpeg 修復(fù)容器

ffmpeg -i broken.wmv -c copy fixed.wmv

這會重新寫入 ASF 頭信息,常能恢復(fù)序列頭。

方案二:程序中容忍錯誤(謹(jǐn)慎使用)

dec_ctx->err_recognition = AV_EF_IGNORE_ERR; // 跳過輕微錯誤

注意:此法不能解決“完全缺失頭信息”的問題,僅適用于輕微損壞。

問題3: Linux/macOS 上解碼失敗,Windows 卻正常?

真相:部分 WMV3 文件使用了 Windows Media 9 Runtime 的私有擴(kuò)展(如非標(biāo) profile、DRM 標(biāo)記),F(xiàn)Fmpeg 的純軟件解碼器無法處理。

應(yīng)對建議:

優(yōu)先在 Windows 環(huán)境下用 FFmpeg 轉(zhuǎn)碼為標(biāo)準(zhǔn)格式:

ffmpeg -i input.wmv -c:v libx264 -c:a aac output.mp4跨平臺項目盡量避免直接處理原始 WMV3,先預(yù)處理為 H.264。

性能優(yōu)化:讓老格式跑出新速度

WMV3 軟件解碼較重,但可通過以下方式提速:

啟用多線程

dec_ctx->thread_count =4;     // 根據(jù) CPU 核心數(shù)調(diào)整
dec_ctx->thread_type =FF_THREAD_FRAME;// 幀級并行

減少不必要處理


若只需分析,可設(shè)置:

dec_ctx->skip_frame =AVDISCARD_NONREF;// 跳過非參考幀

或直接轉(zhuǎn)碼時不渲染畫面,僅提取幀信息。

調(diào)試技巧:當(dāng)畫面“沉默”時,日志會說話

FFmpeg 的日志是診斷神器:

av_log_set_level(AV_LOG_VERBOSE);
// 或只看錯誤
av_log_set_level(AV_LOG_ERROR);

配合命令行快速驗證:

# 查看流信息(重點關(guān)注 codec_name 是否為 vc1)
ffprobe-v quiet -show_streams video.wmv
# 解碼第一幀
ffmpeg-i video.wmv -vframes1-f null

結(jié)語:技術(shù),是記憶的守護(hù)者

每一幀 WMV3 視頻背后,可能是孩子的第一次走路、一場重要的會議、一段消失的城市影像,我們用 FFmpeg 解碼的,不僅是像素,更是時間。

FFmpeg 的偉大,在于它用簡潔的 API,把 VC-1 這樣復(fù)雜的編解碼標(biāo)準(zhǔn),封裝成幾行可讀、可維護(hù)、可跨平臺的代碼,而我們的責(zé)任,是在調(diào)用 avcodec_receive_frame 的那一刻,確保這段記憶,沒有被丟幀,沒有被花屏,完整地,回到了眼前。

供稿:上海三思電子工程有限公司 劉新力、羅乾林、卿培

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

    關(guān)注

    6

    文章

    2002

    瀏覽量

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

    關(guān)注

    3

    文章

    4124

    瀏覽量

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

    關(guān)注

    60

    文章

    2923

    瀏覽量

    45565

原文標(biāo)題:拆·應(yīng)用 | 第八期:基于FFmpeg解碼WMV3視頻,在歷史與代碼之間架一座橋

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

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

掃碼添加小助手

加入工程師交流群

    評論

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

    Linux下基于ffmpeg視頻解碼

    FFmpeg是一套可以用來記錄、轉(zhuǎn)換數(shù)字音頻、視頻,并能將其轉(zhuǎn)化為流的開源計算機(jī)程序。采用LGPL或GPL許可證。它提供了錄制、轉(zhuǎn)換以及流化音視頻的完整解決方案。它包含了非常先進(jìn)的音頻/視頻
    的頭像 發(fā)表于 09-29 14:28 ?4786次閱讀
    Linux下基于<b class='flag-5'>ffmpeg</b>音<b class='flag-5'>視頻</b><b class='flag-5'>解碼</b>

    Tiny4412移植ffmpeg實現(xiàn)視頻解碼

    ?FFmpeg是一套可以用來記錄、轉(zhuǎn)換數(shù)字音頻、視頻,并能將其轉(zhuǎn)化為流的開源計算機(jī)程序。采用LGPL或GPL許可證。它提供了錄制、轉(zhuǎn)換以及流化音視頻的完整解決方案。它包含了非常先進(jìn)的音頻/視頻
    的頭像 發(fā)表于 09-29 15:31 ?2492次閱讀
    Tiny4412移植<b class='flag-5'>ffmpeg</b>實現(xiàn)<b class='flag-5'>視頻</b><b class='flag-5'>解碼</b>

    怎么實現(xiàn)ffmpeg解碼器到龍芯3B的移植?

    本文實現(xiàn)了ffmpeg解碼器到龍芯3B的移植,并針對龍芯3B實現(xiàn)了對向量擴(kuò)展指令支持的特點,對ffmpeg
    發(fā)表于 06-02 06:57

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

    ….. wmv2_bm bm WMV2 decoder wrapper (codec wmv2) V….. wmv3_bm bm WMV3
    發(fā)表于 09-19 07:37

    基于CEVA平臺的WMV視頻解碼器優(yōu)化

    基于CEVA平臺的WMV視頻解碼器優(yōu)化,有興趣的同學(xué)可以下載學(xué)習(xí)
    發(fā)表于 05-04 15:48 ?0次下載

    FFMPEG視頻解碼流程 H.264硬件編解碼實現(xiàn)

    本文闡述了基于FFMpeg的 H.264視頻 硬件編解碼在 S3C6410 處理器上的實現(xiàn)方法,為數(shù)字娛樂、視頻監(jiān)控和
    發(fā)表于 04-03 11:28 ?2w次閱讀
    <b class='flag-5'>FFMPEG</b><b class='flag-5'>視頻</b>編<b class='flag-5'>解碼</b>流程 H.264硬件編<b class='flag-5'>解碼</b>實現(xiàn)

    視頻的編碼和格式的詳細(xì)資料說明

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

    FFmpeg解碼

    H.264,MPEG-2,VC-1和WMV 3。DXVA2硬件加速僅適用于Windows。為了構(gòu)建支持DXVA2的FFmpeg,您需要安裝dxva2api.h頭文件。對于MinGW的,這可以通過進(jìn)行下載由
    發(fā)表于 11-20 23:03 ?2958次閱讀

    基于S3C2440在Linux上實現(xiàn)視頻監(jiān)控系統(tǒng)的FFmpeg解碼設(shè)計

    隨著視頻解碼技術(shù)、計算機(jī)網(wǎng)絡(luò)技術(shù)、數(shù)字信號處理技術(shù)和嵌入式系統(tǒng)的發(fā)展,以嵌入式網(wǎng)絡(luò)視頻服務(wù)器為核心的遠(yuǎn)程視頻監(jiān)控系統(tǒng)開始在市場上嶄露頭角。該系統(tǒng)把攝像機(jī)輸出的模擬
    發(fā)表于 03-05 09:51 ?2247次閱讀
    基于S<b class='flag-5'>3</b>C2440在Linux上實現(xiàn)<b class='flag-5'>視頻</b>監(jiān)控系統(tǒng)的<b class='flag-5'>FFmpeg</b>編<b class='flag-5'>解碼</b>設(shè)計

    在QT上構(gòu)建ffmpeg環(huán)境實現(xiàn)音頻的解碼

    在QT上構(gòu)建ffmpeg環(huán)境,實現(xiàn)音頻的解碼
    發(fā)表于 06-09 09:05 ?1749次閱讀
    在QT上構(gòu)建<b class='flag-5'>ffmpeg</b>環(huán)境實現(xiàn)音頻的<b class='flag-5'>解碼</b>

    Hello FFmpeg

    ffmpeg是一個跨平臺的音視頻錄制、轉(zhuǎn)換、編解碼的庫。使用C語言編寫而成,可在主流移動與PC平臺上使用。ffmpeg不僅提供可嵌入到App中的庫,還提供了可以直接使用的工具。
    的頭像 發(fā)表于 03-03 09:52 ?1253次閱讀
    Hello <b class='flag-5'>FFmpeg</b>

    瑞芯微RK3576平臺FFmpeg硬件編解碼移植及性能測試實戰(zhàn)攻略 觸覺智能RK3576開發(fā)板演示

    本文介紹瑞芯微RK3576平臺,FFmpeg硬件編解碼移植及性能測試方法。演示設(shè)備:觸覺智能RK3576開發(fā)板FFmpeg簡介與實測數(shù)據(jù)FFmpeg簡介
    的頭像 發(fā)表于 09-08 13:58 ?993次閱讀
    瑞芯微RK3576平臺<b class='flag-5'>FFmpeg</b>硬件編<b class='flag-5'>解碼</b>移植及性能測試實戰(zhàn)攻略 觸覺智能RK3576開發(fā)板演示

    瑞芯微RK3588平臺FFmpeg硬件編解碼移植及性能測試實戰(zhàn)攻略

    本文介紹瑞芯微RK3588平臺,FFmpeg硬件編解碼移植及性能測試方法。FFmpeg簡介與實測數(shù)據(jù)FFmpeg簡介FFmpeg是一套多媒體
    的頭像 發(fā)表于 10-21 13:51 ?1395次閱讀
    瑞芯微RK3588平臺<b class='flag-5'>FFmpeg</b>硬件編<b class='flag-5'>解碼</b>移植及性能測試實戰(zhàn)攻略

    瑞芯微RK3562平臺FFmpeg硬件編解碼移植及性能測試實戰(zhàn)攻略

    本文介紹瑞芯微RK3562平臺,FFmpeg硬件編解碼移植及性能測試方法。FFmpeg簡介與實測數(shù)據(jù)FFmpeg簡介FFmpeg是一套多媒體
    的頭像 發(fā)表于 11-28 19:02 ?1041次閱讀
    瑞芯微RK3562平臺<b class='flag-5'>FFmpeg</b>硬件編<b class='flag-5'>解碼</b>移植及性能測試實戰(zhàn)攻略

    基于FFmpeg解封裝WMV和M4V格式

    開源鴻蒙具備多格式音視頻播放能力,其播放器需依次完成解協(xié)議、解封裝、解碼、渲染四大核心步驟,方可將音視頻內(nèi)容完整呈現(xiàn)給用戶;其中,解封裝作為銜接協(xié)議解析與音視頻
    的頭像 發(fā)表于 01-21 12:57 ?134次閱讀