2013-03-20 132 views
3

我有超過1000個視頻的錯誤級別信息,因此不能在某些設備上播放。它們是H.264基線和mp4容器中的aac音頻。我想糾正它們,但避免重新編碼。我是否認爲這是可能的並且會更快?如何識別流中的level_idc位?所有的流都將它們放在同一個位置嗎?我希望這只是在流中的一個地方,這個假設是否正確? 更新:我遇到了一個聲稱要執行此操作的Windows可執行文件link。我希望能夠在unix上執行此命令行,所以我可以編寫腳本。修改MP4流中的H.264級別

更新信息:根據羅馬的回答如下。我挖出了MP4語法,發現Profile和Level信息是avcC原子stsd的一部分。我可以看到該級別設置爲1E,我將其更正爲1F。前:61 76 63 43 01 42 C0 1E FF E1 00 19 67 42 C0 1E D9 後:61 76 63 43 01 42 C0 1F FF E1 00 19 67 42 C0 1E D9與該的MediaInfo改爲:

Video 
ID          : 1 
Format         : AVC 
Format/Info        : Advanced Video Codec 
Format profile       : [email protected] 
Format settings, CABAC     : No 
Format settings, ReFrames    : 3 frames 
Muxing mode        : Container [email protected] 
Codec ID         : avc1 
Codec ID/Info       : Advanced Video Coding 
Duration         : 1mn 4s 
Bit rate         : 3 000 Kbps 
Width         : 1 280 pixels 
Height         : 720 pixels 
Display aspect ratio      : 16:9 
Frame rate mode       : Constant 
Frame rate        : 30.000 fps 
Color space        : YUV 
Chroma subsampling      : 4:2:0 
Bit depth        : 8 bits 
Scan type        : Progressive 
Bits/(Pixel*Frame)      : 0.109 
Stream size        : 22.7 MiB (92%) 
Writing library       : x264 core 120 r2151 a3f4407 
Encoding settings      : cabac=0/ref=3/deblock=1:0:0/analyse=0x1:0x111/me=hex/subme=7/psy=1/psy_rd=1.00:0.00/mixed_ref=1/me_range=16/chroma_me=1/trellis=1/8x8dct=0/cqm=0/deadzone=21,11/fast_pskip=1/chroma_qp_offset=-2/threads=12/sliced_threads=0/nr=0/decimate=1/interlaced=0/bluray_compat=0/constrained_intra=0/bframes=0/weightp=0/keyint=250/keyint_min=25/scenecut=40/intra_refresh=0/rc_lookahead=40/rc=abr/mbtree=1/bitrate=3000/ratetol=1.0/qcomp=0.60/qpmin=0/qpmax=69/qpstep=4/ip_ratio=1.40/aq=1:1.00 

它推出了木星模式參數與3.1水平,但可惜這種流未在設備上播放兩種。如何更正Format Profile中指示的級別這可能不需要重新編碼?

+0

現在設置了什麼級別,需要什麼級別?你可以發佈一些文件的mediainfo嗎? – osgx 2013-03-20 09:46:23

+0

它設置爲3.0,我希望它是3.1,他們都是720p視頻。 – d33pika 2013-03-20 09:51:39

回答

1

請注意,級別在格式描述符上,也可能在有效負載本身上重複。如果你不關心描述符本身和有效載荷/編碼的實際完整性(我認爲提高等級很好,但降低它可能不行),可以在不重編碼視頻的情況下更改等級。

不僅如此,可以通過定位包含視頻軌道描述符並在那裏修補關卡的盒子來實現這一點 - 您不需要FFmpeg,而是直接訪問字節,MP4格式可能很簡單足以從簡單的代碼中完成。或者,您需要在路上重新複用音軌更改格式。解複用器和多路複用器不檢查這個電平值是否可接受,因此將其修補爲FFmpeg重新複用的一部分是可行的。任何寫入MP4而不進行重新編碼的示例FFmpeg代碼都是一個很好的開始(您的任務是在打開AVFormatContext之前更新extradata字段指向的字節數組)。

+0

根據我對H.264的理解,它由可獨立解碼的數據包組成,因此每個數據包在頭中都有一個level_idc。如果我使用選項1,直接修改mp4中的位,我可能必須在流中的多個位置執行此操作? – d33pika 2013-03-21 04:02:41

+0

'level_idc'可能會出現在每一幀中,但通常它只出現在關鍵幀中,而且它也是可選的。當然,您也可能想要修補框架,這取決於您的任務:如果某些軟件或系統由於H而拒絕該文件。264級別,它可能只查看格式描述符來詳細說明拒絕,修補描述符就足夠了。 – 2013-03-21 05:58:44

+0

我修補了描述符。我在stsd下找到了avcC,並將其級別從1E改爲1F。媒體信息在這個文件上運行給我:'VideoID:1格式:AVC格式/信息:高級視頻編解碼器格式配置文件:[email protected]格式設置,CABAC:無格式設置,ReFrames:3幀Muxing模式:容器配置文件= Baseline @ 3.1'但它仍然不能在三星電視上播放。 mediainfo從哪裏獲取其他配置文件?電視似乎關心容器配置文件。 – d33pika 2013-03-22 02:03:37

0

我發現了一個解決方案,值得一提的是@羅曼幫助我弄清楚了這一點。 在mp4比特流中查找avcC原子後的配置文件和級別,在我的情況下,這是42 C0 1E[email protected],我希望級別爲3.1。爲此,請在流中查找所有出現的42 C0 1E,並用1F替換1E。我發現了大約8-10次這樣的事件。現在你有[email protected]。這可以使用mediainfo進行驗證。我認爲這是必要的,因爲h.264被編碼爲一組數據包,並且每個數據包都具有帶有配置文件和級別信息的SPS標頭。