Mp4編碼全介紹

1) 什麼是MP4?聽聞它是一種「容器格式」,那是什麼?
容器格式容許你將不一樣種類的多媒體數據流(多爲視頻流和音頻流)合併在一個單一的文件內。
多媒體容器格式,就是咱們熟知的AVI(.avi), MPEG(.mpg, .mpeg), Matroska(.mkv, .mka), OGM(.ogm), Quicktime(.mov),或Realmedia(.rm, .rmvb).
      
MP4是遵循MPEG-4(ISO 14496-14)的官方容器格式定義的廣義文件擴展名。它能夠流媒體化並支持衆多多媒體的內容(多音軌(multiple audio)、視頻流(video)、字幕(subtitlestreams)、圖片(pictures)、可變楨率(variable-framerates)、碼率(bitrates)、採樣率(samplerates)等)和高級內容(advanced content)(官方稱之爲「Richmedia」(超媒體)或「BIFS」(Binary Format for Scenes/二進制格式場景),相似2D和3D圖形,動畫、用戶界面、類DVD菜單,上述這些AVI搞不定的東西。

2) MP4文件的擴展名用什麼?
-.mp4:惟一的官方擴展名,支持全部音頻和視頻以及高級內容(或它們的混合) 

其餘相關的擴展名:
- .m4v:是.mp4文件的錯誤擴展名,由apple提出,支持視頻+音頻,m4v擴展名能夠安全地改名爲.mp4
- .m4a:是.mp4文件的錯誤擴展名,由apple提出,只支持音頻,m4a擴展名能夠安全地改名爲.mp4
- .m4p:隨iTunes發售的DRM(Digital Rights Management/數字版權保護技術)產權保護的文件,使用Apple開發的DRM sheme
- .m4e:由.sdp修改擴展名的來的文件,Envivio用其於流媒體播放。
- .m4v, -.mp4v, -.cmp, -.divx, .-xvid, .264:raw的mpeg-4視頻流(並不是內含於mp4)。
- .3gp, -.3g2:手機中使用的格式,其中儲存的內容一樣在.mp4未被定義(H.263, AMR(Adaptive Multi Rate/自適應多碼率))。

3) 如何建立標準的MP4文件?
簡單的回答:參考doom9的MP4指南NERO Recode2指南

詳細解答:
1) 爲了製做MP4文件,你應該優先使用MPEG-4標準下的音頻/視頻格式:
- MP4視頻格式包括:MPEG-4 SP(Simple Profile/簡單類)/ASP(Advanced Simple Profile/高級簡單類):xviddivx53ivx,ffmpeg/ffdshowNeroDigital ASP...及MPEG-4 AVC/H.264x264NeroDigital AVCApple...還有MPEG-2, MPEG-1(不含Divx3/M$ MPEG4, WM9, RV9或VP6).-doom9的質量比較測評:1 2
- MP4音頻格式包括:Advanced Audio Coding(AAC FAQ):Quicktime/iTunesNeroPsytelFAACbinary)...(rjamorim的質量比較測評:1 2)和mp3, mp2, mp1, celp(語音), TwinVQ(很是低的碼率), SAOL(midi), ALS(無損)
- MP4字幕/文本格式:MPEG-4時標文本(見Q7)
- MP4圖片格式:JPEG, PNG

2) 使用下列的軟件能夠將遵循MPEG-4的內容Mux進MP4容器:
- GPAC的MP4box,命令行界面,支持AVC(Advanced Video Coding/進階視頻編碼),packed B-frames(打包B楨),高級內容/BIFS,TTXT和章節(Doom9指南
- MPEG4IP的mp4creator,命令行界面,可以混合AVC,但不要用於AVI及(packed) B-frames!
3ivx mp4 muxer,dshow濾鏡,能夠在GraphEdit中使用,支持使用packed B-frames的avi,但不支持AVC(3ivx 指南
mp4UI,操做簡單,軟件基於MPEG4IP,不支持AVC,AVI及(packed) B-frames!(doom9指南
VideoLAN Client,支持AVC,不能用於packed B-frames
ffmpeg,問題多,命令行界面,尤爲不能用於AVC,AVI及(packed) B-frames!
- IBM的Toolkit for MPEG-4,含基於Java的XMTBatch和/或AVGen(也是一個簡易的版本)
dvd2mp4GUI,mp4tool的GUI,能夠簡單的將多音軌及字幕(做爲高級內容)混合進MP4
mp4tool/mp4edit,來自於ENST,相似於mp4box。mp4edit是mp4tool命令行軟件的簡易GUI版本

3) 下面有一些「all-in-one」的MP4編碼工具:
Nero Recode2,使用ASP、AVC或AAC來編碼MP4(Doom9指南),字幕是dvd的vob subs(圖形字幕),包含dshow muxer
- Doom9的MeGUI,支持ASP(xvid, libavcodec), AVC(xvid)和AAC(Besweet - Nero)編碼
HDX4支持ASP和AAC
- Dicas的mpegable X4 live,操做簡單,用dicas的MPEG-4的編碼直接編碼爲mp4
- Envivio的4coder支持MPEG-4 AAC, ASP/SP和AVC

4) 如下工具可用來編輯MP4文件(如分割、追加合併):
MP4Box能夠按照時間和尺寸分割MP4(AAC, ASP, AVC, TTXT, MPEG-1/2, 專用媒體流),提取部分及合併mp4
- ulead的VideoStudio 8+ MPEG-4插件
Quicktime/Pro可以建立(編碼,混合)和編輯(分割、合併)mp4文件,支持MPEG-4 Simple Profile, AAC, AVC

4) 有沒有可能將非MPEG-4標準的數據流放進MP4?
能夠,雖然我不認爲這是個好主意。MPEG-4標準定義瞭如何將數據流放入MP4的方式。相似於AVI,數據流根據專用的FourCCs方式被放入AVI中;在MP4中,每個數據流有一個「專用的軌道ID(private track ID)」。記住,沒有一個播放器可以支持MP4中此類的數據流,只會簡單地把它們忽略。除非你很是明確地要這樣作。
如下的數據流,不遵循MPEG-4標準,但已經可以被放入MP4中了。
- Ogg Vorbis和Ogg Theora,使用MP4Box
- Ogg Vorbis,使用修訂版的mp4creator
- Apple 的無損音頻(ALAC/ALE - 不兼容MPEG-4 ALS),使用iTunes
- DVD圖形字幕(Vobsubs),使用Nero Recode2
- AMR語音,使用NEC e808/e616手機
惟有等到了未來,咱們才能知道此類的非公開數據流可否被普遍的接受和支持。。。

5) 當我從avi中將MPEG-4視頻混合進MP4時,有哪些事項是必須特別注意的?
在作AVIs混合至MP4處理時,有一些潛在的問題。特別是編碼中使用了B楨(b-frames/B-VOPs/bi-directional)。
1)「delay frames(楨延遲)」:因爲一些編碼(Xvid, Divx5)仍然使用舊的VFW界面會致使此問題。只有當使用VirtualDub/Mod編碼且用了B楨時,就會自動丟楨。
2)「packed bitstream(打包的數據流)」 :因舊有容器格式AVI不支持儲存B楨而產生。在DivX5中會用到PB(只有在一個連續B楨的設定狀況下),以及新版本的XviD默認設置是使用PB的(處理時要確認PB選項沒有被勾選),還有使用其餘楨來打包B楨(點擊這裏瞭解更多關於B楨的詳細介紹)。

3)「ctts」atom(節點):當混合b楨進入MP4中必須寫入的信息。
4)「vol(音量)」:在avi的每一個關鍵楨(keyframe)中都要寫入,但如今在MP4中已和影片數據分離開了。

如今,只有3ivx mp4 muxer和GPAC的MP4Box能夠正確的搞定上述問題。推薦只使用它們進行avi的轉換,特別是那些使用packed bitstreams或者那種你不能肯定是否使用了b楨設定/編碼的avi。不然,你極可能不可以獲得100%徹底遵循標準的MP4文件!

6) transmux(轉換並混合)時是否會對文件內容進行重編碼?
不會,這是個無損的處理過程,只是將媒體流從一個容器搬到MP4裏。

7) 我怎樣才能將字幕混合進MP4?
這裏有三種方法能夠實現:
- 相對於MPEG-1/2,MPEG-4標準定義有本身的文本流/字幕標準(基於ISO14496-17的MPEG-4的時標文本)。MP4的字幕格式是基於文本的(不是像DVD字幕那種基於圖形),遵循UTF-8/16標準(含古斯拉夫語、阿拉伯語、中文字符等)。它支持全部的動態效果(滾動、色彩、卡拉ok效果等),且支持附加字體及流媒體化。
MPEG-4 TTXT的製做,已被MP4box和Quicktime支持。
回放時,可使用Haali的MP4 dshow Parser, Osmo4, Realplayer和Quicktime(僅當放入.3gp文件中)。一樣時VideoLan也支持。
- Nero的Recode2能夠用來在MP4中儲存專用數據流(Q4),且能夠輕易的、不加修改的將DVD中的圖形字幕(vobsubs)提出並存入MP4中。
回放此類的媒體流,可使用Nero的濾鏡、Haali的Parser、VideoLan(問題多)和一些硬件支持MP4的DVD播放器。
- 另外一個基於MPEG-4標準儲存字幕進MP4的方法是將字幕轉換爲XMT/BT文本格式,而後將它們編碼爲「高級內容」(BIFS binary格式)存入MP4中。這一方法可適用於任何字幕(使用mp4boxdvd2mp4gui,例如轉換SRT字幕)。
回放這些高級內容,你須要能夠支持此類內容的濾鏡/播放器(見Q12)。

8) 我如何將章節放入MP4文件中?
章節的存儲也可使用高級內容實現(例如建立一個目錄菜單),但Nero使用了另外一個方法。它使用了MP4中的一個特性:稱爲「用戶空間」(user space/udta atom)。它容許在MP4中附加任何你想的東西。(例如,iTunes使用udta atom在mp4中儲存標籤和CD/DVD封面(「coverart」))。
你可使用Nero Recode2在編碼mp4過程當中自動插入章節信息,或者用MP4Box和record2的MP4 directshow muxer filter在已存在的mp4文件中添加章節信息。(例如在GraohEdit中使用此濾鏡)。
關於播放器,若是不能識別在udta中儲存的章節信息,則會簡單的忽略掉。你須要一個能夠搞定此特殊章節信息的播放器或濾鏡。(例如,Gabest, Haali, Nero或3ivx)。

9) 我如何對MP4文件進行編排創做(例如建立類DVD的菜單)?有沒有例子?
基本上編排創做應「手動」編寫一個文本的語言格式,稱爲XMTbt(基於VRML(Virtual Reality Modeling Language/虛擬現實建模語言),就像咱們熟知的Flash),一種可以把它做爲binary格式(稱爲BIFS)編碼/編譯入mp4(免費的編碼器爲mp4boxmp4toolXMTBatch)。
如今已經有一些面向MP4編排創做的GUI了,使得這一過程變得很方便。例如IBMAVIPIXEnvivioMindegoiVASTDigimaxEtri,但都未向大衆開放。

因此,若是你想親自編排創做MP4,除了編輯一個BT/XMT的腳本外沒有別的辦法。
感謝GPAC的傢伙們,如今已經有了關於這個處理方法的指南(英文版法文版),這將對你有不小的幫助。
爲了使這個過程更簡單,我創做了一個簡單的腳本工具,命名爲MP4menu,如今已經支持DVD菜單能夠提供的全部特性。你能夠按照本身的需求使用(指南)。

若是你想看一下實例以瞭解有什麼別的能夠放入MP4中,看一下這個小的含視頻的菜單樣本。可是MPEG-4系統還能提供2D和3D的動畫效果(想一下玩具總動員和海底總動員這些影片),看一下這個小的2d動畫樣本(不含視頻流)。
確認你使用的是MPEG-4系統支持的播放器,如GPAC Osmo4 player,來觀看這些樣本。
php

10) 我如何才能在MP4文件中使用可變形重設尺寸(anamorphic resize)?
MPEG-4標準崇尚「多才能」,可以知足大衆的各類需求。它提供了三種可能性:
1) 碼流方面:這多是最具可行性且最大衆化的方法。
使用能夠設定PAR(pixel aspect ratio/像素寬高比)的編碼(例如3ivx, ffmpeg/ffvfw, xvid)。而後使用任一種MP4的Muxer工具(例如3ivx mp4 mixerMP4Boxmp4UI)將獲得的AVI Mux至mp4。對於已存在的碼流,你可使用Moitah的MPEG4 Modifier對MPEG-4 ASP進行修改PAR;使用hhanh的ARChange對AVC進行修改PAR。
下列工具可自動在回放中支持可變形重設尺寸:VideoLan, Mplayer或者帶有3ivx, nero或haali parser加上XviD(xvid decode設置AR爲auto), 3ivx(打開「force overlay」), Nero或ffdshow(打開「overlay mixer」)解碼濾鏡的dshow播放器。
2) 容器方面:MP4提供了一種「合成矩陣(Composition Matrix)」,可以修改AR、畫面旋轉、支持多層數據、回放時將兩條音軌混音(例:將影片的語音和音樂分離)等功能。
Quicktime/Pro提供了很好的合成方法,經過:Movie -> Get Movie Properties -> Video/Sound Track -> Size/Layer/Volume/... ,還可以正確回放此類經合成編輯的MP4文件。
3) BIFS方面:提供了最普遍的編排創做的可能(Q9),一樣還可以修改AR(例:經過改變2d縮放(Transform2D.scale))。你可使用GPAC的工程軟件:MP4box和Osmo4來建立和回放此類BIFS控制的數據流。

11) 有沒有可能在MP4中建立VFR(Variable Framerate/可變幀率)內容?
能夠。察看下面的帖子

12) 我如何播放MP4文件?
因爲MP4的互用性這一巨大優點及開源標準(受權免費!)這些特性,如今已有衆多工具能夠在不一樣系統包括Mac, Linux, PocketPC固然還有windows中支持MP4。

1) 若是你想用基於dshow的播放器(例如media player classicbsplayerzoomplayer或者蹩腳的windows media player)來回聽任何此類的媒體文件,首先你須要用到下面兩個東西:
-- 一個分離濾鏡(splitter/parser filter):它可以在回放時將容器中包含的數據流(音頻流、視頻流、字幕流)分離開。
-- 一個解碼濾鏡(decode filter):它(例如:ffdshow, 3ivx, CoreAAC)可以將編碼的數據流解碼。
順便說一下,咱們在播放AVI時不須要安裝分離濾鏡的惟一緣由是windows系統已經默認安裝了這個東西。

這裏有一些組件包,包含了這些濾鏡:
-- Gabest's MP4 Splitter支持AAC, ASP, AVC, MPEG-1/2音頻(如MP2/MP3)與視頻, 先進TTXT, MP4中的VobSubs和章節, 開源(Gabest的MPC播放器已經內建此濾鏡)
-- Haali's Media Splitter支持MP4中的AAC, ASP, AVC, MPEG-1/2音頻(例:mp2/mp3)和視頻,TTXT,vobsubs和章節,並支持地切換音頻、視頻、字幕,是無限制的,部分開源的,免費的
-- 3ivx支持MP2, MP3, AAC, ASP, 章節但不支持MP4裏的AVC!使用ffdshow或CoreAAC這樣的解碼器時請肯定「allow unsupport decoders」 選項已勾選
-- Elecard提供了支持AAC, ASP, AVC的MP4 splitter,並附帶ASP/AVC解碼器
-- Nero支持AAC, ASP, AVC, vobsubs和章節(Nero7下只限Nero Showtime!Nero6下僅Nero Showtime支持字幕/章節/多音軌!)
-- HDX4支持MP4中的AAC和ASP
-- EnvivioTV 支持MP4中的高級內容/BIFS(樣本), AAC, ASP和AVC
-- Moonlight提供了支持MP3, AAC, ASP, AVC的MP4 splitter,並附帶ASP/AVC解碼器
-- Dicas的mpegable,支持RTP(Real-Time Transport Protocol/實時傳輸協議)流媒體,AAC, ASP和AMR(.3gp音頻)的解碼
-- Ligos的LSX-MPEG,僅支持Simple Profile視頻,30天預覽版本

2) 若是你不能/不想使用基於windows dshow的播放器,你也可使用下列的播放器來播放MP4:
-- Apple的Quicktime,普遍使用,支持MPEG-4 SP, AVC和AAC
-- Realnetworks的RealPlayer10,支持MPEG-4 SP + b楨(僅plus版本)和AAC
-- GPAC的Osmo4,開源(GPL),支持BIFS(字幕,用戶互動,類dvd目錄...)和TTXT
-- MPlayer,開源(GPL),支持ASP和AVC,支持衆多系統,象Win, Linux, Mac OS...
-- Videolan,開源(GPL),支持ASP和AVC,多系統支持
-- MPEG4IP的WMP4Player,開源(LGPL(Lesser General Public
License/GNU較寬鬆公共許可證)/MPL(Mozilla Public License)),支持ASP和AVC
-- xine,開源(GPL),多系統支持
-- TCPMP,用於PalmOS/WindowsCE
-- Philips的Platform4 Player支持PocketPC
-- ENST的Osmo4(基於參考源),支持高級內容/BIFS
-- IBM的M4Play含Toolkit for MPEG-4,基於Java,支持高級內容/BIFS

3) 硬件/獨立播放器:因爲最流行的MPEG-4 ASP執行者(DivX5/XviD)常常被放入AVI中,那也成爲了如今播放器最普遍支持的格式。一樣是nero的那些傢伙,也是爲了知足消費者日益增加的需求,他們嘗試將MP4容器格式可以被硬件播放器支持,並逐步取得了成功:
支持MP4的硬件播放器以下:
-- Avayon的DXP-1000支持MP4的AAC, ASP, VobSubs和章節
-- elta的8815 MP4支持MP4的AAC, ASP, VobSubs和章節
-- Gowell的AS 602支持MP4的AAC, ASP, VobSubs和章節
-- Kiss的DP-558支持AAC, ASP(不支持QPel(Quarter-Pixel/1/4象素預測)/GMC(Global Motion Compensation/全局動態補償)),支持VobSubs和章節(Sigma Designs EM8560)
-- Packard Bell的DVD-DivX 450 pro支持MP4的AAC, ASP, VobSubs和章節
-- Philips的DVP630/632/642播放器支持MP4的ASP(不支持QPel/1WP GMC), MP3(非AAC)(ESS Vibratto-II)
-- RJTech的RJ 1500DVX II支持MP4的AAC(5.1), MP3, ASP (QPel/1WP GMC/CQM), VobSubs, 章節(ESS Vibratto-II)
-- Siemssen的SCO 5000ND支持MP4的AAC(不支持MP3/MP2),ASP (QPel/1WP GMC), VobSubs, 章節(Zoran Vaddis 776)。 
-- Targa的DR-5200x支持MP4的AAC, ASP, VobSubs和章節
-- Tevion DR 2004,支持MP4的AAC, ASP (QPel/1WP GMC?)和VobSubs。
-- Tevion DVD-4000,最新的固件(firmware)支持MP4的ASP(不支持QPel/1WP GMC?)和MP3(非AAC)(ESS Vibratto-II)
-- Xoro的HSD 415/310播放器支持MP4的AAC, ASP(不支持QPel/1WP GMC?), VobSubs, 章節(ESS Vibratto-II)。 
-- M$的XboxXbox Media Center支持MP4的MP2, MP3, AAC和AVC。
-- Sony的Playstation Portable(PSP)支持MP4的AAC, SP和AVC,保存在記憶棒(Memory Stick)中
-- Apple的iPod支持MP4的AAC,iPod video還支持AVC
-- Sigma Designs的Xcard支持在PC上硬體解碼MPEG-4包括MP4容器

13) 如何直播/收看實時(live-)的MP4流媒體?
Apple和MPEG4IP提供了不錯的、免費的工具以將MP4流媒體化:
想要作流媒體服務器,你可使用Apple's Darwin Streaming Server,這是everwikedlinuxjornal裏提供的操做指南。
要直播流媒體你可使用MPEG4IP的mp4live(僅Linux支持),這是everwikedMPEG4IP的指南;在Windows系統中,你可使用MPEGRecorder(看上去像mp4live的一個端口)。
一樣,你能夠看一下ViTooKi的工具包(開源的流媒體服務器、播放器和其餘相關工具)。
另外一個免費、開源的mp4流媒體服務器是Cata提供的。
若是是MAC系統,你能夠看一下Live Channel

要播放廣播/直播式的流媒體,你能夠用Apple的Quicktime, Real的RealPlayer 10, MPEG4IP的WMP4Player, Dica的mpegableEnvivioTV(都運做在dshow播放器下)和GPAC的Osmo4(最後兩個也能夠支持高級內容/用戶互動)(Envivio的互動演示)。
經過MediaFrame(演示)和IBM(互動演示)的java applets你也能夠在不支持安裝播放器狀況下來播放流媒體的MP4。

流媒體樣本:1 2

14) 那裏能夠找到mp4碼率計算工具?爲何由源AVI製做獲得的MP4文件體積要比源AVI文件體積小一點?
MP4須要的overhead的容量遠小於AVI容器(特別是VBR-mp3音軌)。勿需質疑,與AVI容器相反,MP4容器就是爲MPEG-4視頻和MP3設計的。
這裏有一個計算式,你能夠這樣說:AVI中的視頻流文件體積=最終輸出的含視頻音頻的MP4文件體積(像700MB) - MP4的音頻體積 + 3MB。
3ivx在它的主頁上也提供了一個MP4碼率計算工具,但它看上去不是十分精確。

15) MP4支持CRC(Cyclic Redundancy Check)/循環冗餘碼校驗)/EDC(Error Detection Code/錯誤校驗)或ECC(Error Correction Code/自糾錯)嗎?
不支持。MP4容器自己,乃至MPEG-4標準都不但願支持碼流中的錯誤檢測/糾正(Error Detection/Correction)(它們該用在該用的地方)。
點擊這裏,瞭解更多有關MPEG-4碼流中的差錯恢復(Error Resilience)。

16) 有沒有可能得知一個MP4文件是用何種編碼建立的?
是的。對於MPEG-4 ASP的視頻流和MP3音頻流(如今尚未一個真正的方法來確認是否用了AAC音頻編碼)來講,是能夠的。
點擊這裏,瞭解更多。

17) MP4是MP3的繼承者嗎?
是,也不是。說它不是,由於MP3是一種特別的音頻格式,而MP4是一種容器格式並不是是音頻編碼。說它是的,由於MP4是MPEG-4標準的一部分,MPEG-4標準是MPEG-1/2的繼承者,而mp3亦是它的一部分。
MPEG-4還包括AAC,一種比MP3更好的音頻編碼,也被用於MP4中。

18) MP4和MOV/3GP是同樣的嗎?
Apple的MOV容器格式確實與MP4的出發點相同(主要在moov atom方面),但它們之間仍是有很多區別的。
從另外一方面來講,MP4的出發點是3GP格式(一般用於手機中)的開發。3GP格式廣泛用於MP4中,就像用於MOV中同樣。然而,這還是另外一種格式。

19) 我還想了解更多關於MP4!在哪裏可以找到更多信息?
在網絡上有很多此類的信息:
MP4的說明文件可在這裏找到。MPEG-4系統標準的草案可在這裏找到。
有一些關於MP4的文檔:1 2 3
MPEG Industry ForumMotion Picture Experts Group(MPEG)的主頁上也有許多信息。
關於MPEG-4標準MPEG-4系統(很是有技術價值)的FAQs是頗有用的。
另外能夠在audiocoding wiki找到許多信息(也有許多關於AAC的信息)。
關於MP4的建立編譯成果MPEG4IP有很多指南,一樣他們的CVS服務器everwicked.com上也有指南。 
html

相關文章
相關標籤/搜索