AAC(高階音訊編碼)幀格式及編碼介紹
參考資料:
OUTLINE:
* AAC概述
* AAC規格簡述
* AAC特點
* AAC音訊檔案解析
——ADIF&ADTS格式
——ADIF&ADTS頭資訊
——ADIF&ADTS資料資訊
——AAC檔案處理流程
* AAC解碼流程
——技術解析
* 術語說明
一.AAC概述
AAC是高階音訊編碼(Advanced Audio Coding)的縮寫,出現於1997年,最初是基於MPEG-2的音訊編碼技術。由Fraunhofer IIS、Dolby Laboratories、AT&T、Sony等公司共同開發,目的是取代MP3格式。2000年,MPEG-4標準出臺,AAC重新集成了其它技術(PS,SBR),為區別於傳統的MPEG-2 AAC,故含有SBR或PS特性的AAC又稱為MPEG-4 AAC。
AAC是新一代的音訊有失真壓縮技術,它通過一些附加的編碼技術(比如PS,SBR等),衍生出了LC-AAC,HE-AAC,HE-AACv2三種主要的編碼,LC-AAC就是比較傳統的AAC,相對而言,主要用於中高位元速率(>=80Kbps),HE-AAC(相當於AAC+SBR)主要用於中低碼(<=80Kbps),而新近推出的HE-AACv2(相當於AAC+SBR+PS)主要用於低位元速率(<=48Kbps),事實上大部分編碼器設成<=48Kbps自動啟用PS技術,而>48Kbps就不加PS,就相當於普通的HE-AAC。
二、AAC規格簡述
AAC共有9種規格,以適應不同的場合的需要:
MPEG-2 AAC LC 低複雜度規格(Low Complexity)--比較簡單,沒有增益控制,但提高了
編碼效率,在中等位元速率的編碼效率以及音質方面,都能找到平衡點
MPEG-2 AAC Main 主規格
MPEG-2 AAC SSR 可變取樣率規格(Scaleable Sample Rate)
MPEG-4 AAC LC 低複雜度規格(Low Complexity)------現在的手機比較常見的MP4檔案中
的音訊部份就包括了該規格音訊檔案
MPEG-4 AAC Main 主規格 ------包含了除增益控制之外的全部功能,其音質最好
MPEG-4 AAC SSR 可變取樣率規格(Scaleable Sample Rate)
MPEG-4 AAC LTP 長時期預測規格(Long Term Predicition)
MPEG-4 AAC LD 低延遲規格(Low Delay)
MPEG-4 AAC HE 高效率規格(High Efficiency)-----這種規格適合用於低位元速率編碼,有
Nero ACC 編碼器支援
目前使用最多的是LC和HE(適合低位元速率)。流行的Nero AAC編碼程式只支援LC,HE,HEv2這三種規格,編碼後的AAC音訊,規格顯示都是LC。HE其實就是AAC(LC)+SBR技術,HEv2就是AAC(LC)+SBR+PS技術;
Hev1和HEv2用此圖簡單表示:
(圖中AAC即指的是原來的AAC-LC)
HE:“High Efficiency”(高效性)。HE-AAC v1(又稱AACPlusV1,SBR),用容器的方法實現了AAC(LC)+SBR技術。SBR其實代表的是Spectral Band Replication(頻段複製)。簡要敘述一下,音樂的主要頻譜集中在低頻段,高頻段幅度很小,但很重要,決定了音質。如果對整個頻段編碼,若是為了保護高頻就會造成低頻段編碼過細以致檔案巨大;若是儲存了低頻的主要成分而失去高頻成分就會喪失音質。SBR把頻譜切割開來,低頻單獨編碼儲存主要成分,高頻單獨放大編碼儲存音質,“統籌兼顧”了,在減少檔案大小的情況下還儲存了音質,完美的化解這一矛盾。
HEv2:用容器的方法包含了HE-AAC v1和PS技術。PS指“parametric stereo”(引數立體聲)。原來的立體聲檔案檔案大小是一個聲道的兩倍。但是兩個聲道的聲音存在某種相似性,根據夏農資訊熵編碼定理,相關性應該被去掉才能減小檔案大小。所以PS技術儲存了一個聲道的全部資訊,然後,花很少的位元組用引數描述另一個聲道和它不同的地方。
三、AAC特點
(1)AAC是一種高壓縮比的音訊壓縮演算法,但它的壓縮比要遠超過較老的音訊壓縮演算法,
如AC-3、MP3等。並且其質量可以同未壓縮的CD音質相媲美。
(2)同其他類似的音訊編碼演算法一樣,AAC也是採用了變換編碼演算法,但AAC使用了解析度
更高的濾波器組,因此它可以達到更高的壓縮比。
(3)AAC使用了臨時噪聲重整、後向自適應線性預測、聯合立體聲技術和量化哈夫曼編碼等最新技術,這些新技術的使用都使壓縮比得到進一步的提高。
(4)AAC支援更多種取樣率和位元率、支援1個到48個音軌、支援多達15個低頻音軌、具有
多種語言的相容能力、還有多達15個內嵌資料流。
(5)AAC支援更寬的聲音訊率範圍,最高可達到96kHz,最低可達8KHz,遠寬於MP3的16KHz-48kHz的範圍。
(6)不同於MP3及WMA,AAC幾乎不損失聲音訊率中的甚高、甚低頻率成分,並且比WMA在頻譜結構上更接近於原始音訊,因而聲音的保真度更好。專業評測中表明,AAC比WMA聲音更清晰,而且更接近原音。
(7)AAC採用優化的演算法達到了更高的解碼效率,解碼時只需較少的處理能力。
四、AAC音訊檔案格式
1. AAC的音訊檔案格式有ADIF & ADTS:
ADIF:Audio Data Interchange Format 音訊資料交換格式。這種格式的特徵是可以確定的找到這個音訊資料的開始,不需進行在音訊資料流中間開始的解碼,即它的解碼必須在明確定義的開始處進行。故這種格式常用在磁碟檔案中。
ADTS:Audio Data Transport Stream 音訊資料傳輸流。這種格式的特徵是它是一個有同步字的位元流,解碼可以在這個流中任何位置開始。它的特徵類似於mp3資料流格式。
簡單說,ADTS可以在任意幀解碼,也就是說它每一幀都有頭資訊。ADIF只有一個統一的頭,所以必須得到所有的資料後解碼。且這兩種的header的格式也是不同的,目前一般編碼後的和抽取出的都是ADTS格式的音訊流。兩者具體的組織結構如下所示:
AAC的ADIF格式見下圖:
AAC的ADTS的一般格式見下圖:
圖中表示出了ADTS一幀的簡明結構,其兩邊的空白矩形表示一幀前後的資料。
2. ADIF和ADTS的header
ADIF 的頭資訊:
ADIF頭資訊位於AAC檔案的起始處,接下來就是連續的 raw data blocks。
組成ADIF頭資訊的各個域如下所示:
ADTS 的固定頭資訊:
ADTS的可變頭資訊:
(1)幀同步目的在於找出幀頭在位元流中的位置,13818-7規定,aac ADTS格式的幀頭
同步字為12位元的“1111 1111 1111”.
(2)ADTS的頭資訊為兩部分組成,其一為固定頭資訊,緊接著是可變頭資訊。固定頭資訊中
的資料每一幀都相同,而可變頭資訊則在幀與幀之間可變。
3.AAC元素資訊
在AAC中,原始資料塊的組成可能有六種不同的元素:
SCE: Single Channel Element單通道元素。單通道元素基本上只由一個ICS組成。一個
原始資料塊最可能由16個SCE組成。
CPE: Channel Pair Element 雙通道元素,由兩個可能共享邊資訊的ICS和一些聯合立體
聲編碼資訊組成。一個原始資料塊最多可能由16個SCE組成。
CCE: Coupling Channel Element 藕合通道元素。代表一個塊的多通道聯合立體聲資訊
或者多語種程式的對話資訊。
LFE: Low Frequency Element 低頻元素。包含了一個加強低取樣頻率的通道。
DSE: Data Stream Element 資料流元素,包含了一些並不屬於音訊的附加資訊。
PCE: Program Config Element 程式配置元素。包含了聲道的配置資訊。它可能出現在
ADIF 頭部資訊中。
FIL: Fill Element 填充元素。包含了一些擴充套件資訊。如SBR,動態範圍控制資訊等。
4.AAC檔案處理流程
(1) 判斷檔案格式,確定為ADIF或ADTS
(2) 若為ADIF,解ADIF頭資訊,跳至第6步。
(3) 若為ADTS,尋找同步頭。
(4)解ADTS幀頭資訊。
(5)若有錯誤檢測,進行錯誤檢測。
(6)解塊資訊。
(7)解元素資訊。
五、AAC解碼流程
(AAC解碼流程圖)
在主控模組開始執行後,主控模組將AAC位元流的一部分放入輸入緩衝區,通過查詢同步字
得到一幀的起始,找到後,根據ISO/IEC 13818-7所述的語法開始進行Noisless Decoding(無
噪解碼),無噪解碼實際上就是哈夫曼解碼,通過反量化(Dequantize)、聯合立體聲(Joint
Stereo),知覺噪聲替換(PNS),瞬時噪聲整形(TNS),反離散餘弦變換(IMDCT),頻段複製
(SBR)這幾個模組之後,得出左右聲道的PCM碼流,再由主控模組將其放入輸出緩衝區輸出到
聲音播放裝置。
技術解析:
1.主控模組:
所謂的主控模組,它的主要任務是操作輸入輸出緩衝區,呼叫其它各模組協同工作。
其中,輸入輸出緩衝區均由DSP控制模組提供介面。輸出緩衝區中將存放的資料為解碼出來的
PCM資料,代表了聲音的振幅。它由一塊固定長度的緩衝區構成,通過呼叫DSP控制模組的接
口函式,得到頭指標,在完成輸出緩衝區的填充後,呼叫中斷處理輸出至I2S介面所連線的
音訊ADC晶片(立體聲音訊DAC和DirectDrive耳機放大器)輸出模擬聲音。
2.Noisless Decoding(無噪解碼):
無噪編碼就是哈夫曼編碼,它的作用在於進一步減少尺度因子和量化後頻譜的冗餘,
即將尺度因子和量化後的頻譜資訊進行哈夫曼編碼。全域性增益編碼成一個8位的無符號整數,
第一個尺度因子與全域性增益值進行差分編碼後再使用尺度因子編碼表進行哈夫曼編碼。後續
的各尺度因子都與前一個尺度因子進行差分編碼。量化頻譜的無噪編碼有兩個頻譜系數的劃分。 其一為4元組和2元組的劃分,另一個為節劃分。對前一個劃分來說,確定了一次哈夫曼表
查找出的數值是4個還是2個。對後一個劃分來說,確定了應該用哪一個哈夫曼表,一節中
含有若干的尺度因子帶並且每節只用一個哈夫曼表。
——分段
無噪聲編碼將輸入的1024個量化頻譜系數分為幾個段(section),段內的各點均使用
同一個哈夫曼表,考慮到編碼效率,每一段的邊界最好同尺度因子帶的邊界重合。所以每一段
必段傳送資訊應該有:段長度,所在的尺度因子帶,使用的哈夫曼表。
——分組和交替
分組是指忽略頻譜系數所在窗,將連續的,具有相同尺度因子帶的頻譜系數分為一組放在
一起,共享一個尺度因子從而得到更好的編碼效率。這樣做必然會引起交替,即本來是以
c[組][窗][尺度因子帶][ 係數索引]
為順序的係數排列,變為將尺度因子帶同的係數放在一起:
c[組][尺度因子帶][窗][ 係數索引]
這樣就引起了相同窗的係數的交替。
——大量化值的處理
大量化值在AAC中有兩種處理方法:在哈夫曼編碼表中使用escape標誌或使用脈衝
escape方法。前者跟mp3編碼方法相似,在許多大量化值出現時採用專門的哈夫曼表,這個表
暗示了它的使用將會在哈夫曼編碼後面跟跟一對escape值及對值的符號。在用脈衝escape
方法時,大數值被減去一個差值變為小數值,然後使用哈夫曼表編碼,後面會跟一個脈衝結構
來幫助差值的還原.
3.尺度因子解碼及逆量化
在AAC編碼中,逆量化頻譜系數是由一個非均勻量化器來實現的,在解碼中需進行其逆運算。 即保持符號並進行4/3次冪運算。
在頻域調整量化噪聲的基本方法就是用尺度因子來進行噪聲整形。尺度因子就是一個用來改
變在一個尺度因子帶的所有的頻譜系數的振幅增益值。使用尺度因子這種機制是為了使用非
均勻量化器在頻域中改變數化噪聲的位元分配。
——尺度因子帶(scalefactor-band)
頻率線根據人耳的聽覺特性被分成多個組,每個組對應若干個尺度因子,這些組就叫做尺度
因子帶。為了減少資訊含有短窗的邊資訊,連續的短窗可能會被分為一組,即將若干個短窗
當成一個視窗一起傳送,然後尺度因子將會作用到所有分組後的視窗去。
4.聯合立體聲(Joint Stereo)
聯合立體聲的是對原來的取樣進行的一定的渲染工作,使聲音更”好聽”些。
5.知覺噪聲替換(PNS)
知覺噪聲替換模組是一種以引數編碼的方式模擬噪聲的模組。在判別出音訊值中的噪
聲後,將些噪聲不進行量化編碼,而是採用一些引數告訴解碼器端這是某種噪聲,然後解
碼器端將會對這些噪聲用一些隨機的編碼來製造出這一型別的噪聲。
在具體操作上,PNS模組對每個尺度因子帶偵測頻率4kHz以下的訊號成分。如果這個
訊號既不是音調,在時間上也無強烈的能量變動,就被認為是噪聲訊號。其訊號的音調及能
量變化都在心理聲學模型中算出。
在解碼中,如果發現使用了哈夫曼表13(NOISE_HCB),則表明使用了PNS。由於M/S立體
聲解碼與PNS解碼互斥,故可以用引數ms_used來表明是否兩個聲道都用同樣的PNS。如果
ms_used引數為1,則兩個聲道會用同樣的隨機向量來生成噪聲訊號。PNS的能量訊號用
noise_nrg來表示,如果使用了PNS,則能量訊號將會代替各自的尺度因子來傳送。噪聲能量
編碼同尺度因子一樣,採用差分編碼的方式。第一個值同樣為全域性增益值。它同強度立體聲位
置值及尺度因子交替地放在一起,但對差分解碼來說又彼此忽略。即下一個噪聲能量值以上一
個噪聲能量值而不是強度立體聲位置或尺度因子為標準差分解碼。隨機能量將會在一個尺度
因子帶內產生noise_nrg所計算出的平均能量分佈。此項技術只有在MPEG-4 AAC中才會使用。
6.瞬時噪聲整形(TNS)
這項神奇的技術可以通過在頻率域上的預測,來修整時域上的量化噪音的分佈。在一
些特殊的語音和劇烈變化訊號的量化上,TNS技術對音質的提高貢獻巨大!
TNS瞬態噪聲整形用於控制一個轉換視窗內的瞬時噪聲形態。它是用一個對單個通道的
濾波過程來實現的。傳統的變換編碼方案常常遇到訊號在時域變化非常劇烈的問題,特別是語
音訊號,這個問題是因為量化後的噪聲分佈雖然在頻率域上得到控制,但在時域上卻以一個常
數分佈在一個轉換塊內。如果這種塊中訊號變化得很劇烈卻又不轉向一個短塊去,那這個常數
分佈的噪聲將會被聽到。
TNS的原理利用了時域和頻域的二元性和LPC(線性預測編碼)的時頻對稱性,即在其中的
任意一個域上做編碼與在另一域上做預測編碼等效,也就是說,在一個域內做預測編碼可以在
另一域內增加其解析度。量化噪聲產生是在頻域產生的,降低了時域的解析度,故在這裡是在
頻域上做預測編碼。在AACplus中,由於基於AAC profile LC,故TNS的濾波器階數被限制在
12階以內。
7.反離散餘弦變換(IMDCT)
將音訊資料從頻域轉換到時域的過程主要是由將頻域資料填入一組IMDCT濾波器來實現
的。在進行IMDCT變換後,輸出數值經過加窗,疊加,最後得到時域數值。
8.頻段複製(SBR)
簡要敘述,音樂的主要頻譜集中在低頻段,高頻段幅度很小,但很重要,決定了
音質。如果對整個頻段編碼,若是為了保護高頻就會造成低頻段編碼過細以致檔案巨大;若是
儲存了低頻的主要成分而失去高頻成分就會喪失音質。SBR把頻譜切割開來,低頻單獨編碼儲存
主要成分,高頻單獨放大編碼儲存音質,“統籌兼顧”了,在減少檔案大小的情況下還儲存了
音質,完美的化解這一矛盾。
9.引數立體聲(PS)
對於之前的立體聲檔案來說,其檔案大小是單聲道的兩倍,但是兩個聲道的聲音存在
某種相似性,根據夏農資訊熵編碼定理,相關性應該被去掉才能減小檔案大小。所以PS技術
儲存了一個聲道的全部資訊,之後,用很少的位元組當作引數來描述另一個聲道和它不同的地方。
術語說明:
AAC: Advanced Audio Coding 高階音訊編碼
AAC LC: AAC with Low Complexity AAC的低複雜度配置
AAC plus: 也叫HE-AAC, AAC+,MPEG4 AAC LC加入SBR模組後形成的一個AAC版本
MPEG:Motion Picture Expert Group
IMDCT:反離散餘弦變換
ADIF:Audio Data Interchange Format 音訊資料交換格式
ADTS:Audio Data Transport Stream 音訊資料傳輸流
SCE: Single Channel Element單通道元素
CPE: Channel Pair Element 雙通道元素
CCE: Coupling Channel Element 藕合通道元素
DSE: Data Stream Element 資料流元素
PCE: Program Config Element 程式配置元素
FIL: Fill Element 填充元素
ICS: Individual Channel Stream 獨立通道流
PNS: Perceptual Noise Substitution 知覺噪聲替換
SBR: Spectral Band Replication 頻段複製
TNS: Temporal Noise Shaping 瞬時噪聲整形
ch:channel 通道
PS:parametric stereo 引數立體聲
SBR:Spectral Band Replication 頻段複製
http://blog.csdn.net/sunnylgz/article/details/7676340
相關推薦
AAC(高階音訊編碼)幀格式及編碼介紹
參考資料: OUTLINE: * AAC概述 * AAC規格簡述 * AAC特點 * AAC音訊檔案解析 ——ADIF&ADTS格式
python第三天學習復習,集合set,文件操作,函數(普通函數,遞歸,高階函數),字符編碼和解碼
下層 utf-8 只讀 sub pytho bsp for sca move 三元運算 age = 23 #就是if else的簡單寫法 a = age if age < 20 else 25 集合 set #集合是無序切不重復的, #當對列表去重復的時候,
js上傳文件(圖片)限制格式及大小為3M
max element 不能 jpg script 圖片大小 -s 打開 -1 本文保存為.html文件用瀏覽器打開即可測試功能 <form id="form1" name="form1" method="post" action="" enctype="m
資料結構與演算法JavaScript描述讀書筆記(高階排序演算法)
希爾排序 在插入排序的基礎上,只不過比較的步長不一樣,插入排序比較步長一直是1(即一個一個的比較)。希爾排序的步長第一次一般設定為gap=Math.floor(arr.length/2),之後依次將步長設定為gap/2,直到步長變為1,這個時候徹底轉化成插入排 測試時間普通排序演算法1
10.基於FFMPEG+SDL2播放video---音視訊同步(參考音訊時鐘)
繼續FFMPEG學習之路。。。 參考資料: An ffmpeg and SDL Tutorial 文章目錄 1 綜述 2 音視訊同步 3 DTS 和 PTS 4 音訊時鐘 5 視訊PTS 6 同步 7 不
資料預處理:獨熱編碼(One-Hot Encoding)和 LabelEncoder標籤編碼
一、問題由來 在很多機器學習任務中,特徵並不總是連續值,而有可能是分類值。 離散特徵的編碼分為兩種情況: 1、離散特徵的取值之間沒有大小的意義,比如color:[red,blue],那麼就使用one-hot編碼 2、離散特徵的取值有大小的意義,比如size:[
JAVA高階基礎(44)---NIO簡介及緩衝區介紹
NIO Java NIO(New IO)是從Java1.4版本開始引入的一個新的IO API。NIO與原來的IO有同樣的作用和目的,但是使用的方式完全不同,NIO支援面向緩衝區的、基於通道的IO操作。 NIO支援面向緩衝區的、基於通道的IO操作。 NIO將以更加高
大資料崗位集合——架構師、基礎研發、平臺研發(高階、資深)上海、北京、蘇州**
我是獵頭聞慄,以下是目前最新大資料類崗位,如果有感興趣的同學歡迎及時聯絡我 電話(微信)15809212974 簡歷傳送郵箱:[email protected] 【職位1】:大資料基礎架構研發工程師 【地點】:蘇州 【公司】:思必馳——專注智慧硬體的語
2018.12.30【NOIP訓練】任意模數二次剩餘(高階數論大雜燴)
描述 求解關於xx的方程: x 2
TensorFlow實戰(五)——交通標誌牌(GTSRB資料集)的格式轉換(二)
前言: 在上一篇部落格學習瞭如何將資料集轉換成jpg檔案,本文介紹如何將資料集轉換為png的格式,以及如何將資料資訊儲存在csv檔案中,實現程式碼比上編部落格有所改進。一、格式轉換 我的訓練資料集儲存路徑如下:隨意進入一個資料夾,可以看到: 來看看測
activiti 動態配置 activiti 監聽引擎啟動和初始化(高階原始碼篇)
1.1.1. 前言 使用者故事:現在有這樣一個需求,第一個需求:公司的開發環境,測試環境以及線上環境,我們使用的資料庫是不一樣的,我們必須能夠任意的切換資料庫進行測試和釋出,對資料庫連線字串我們需要加密,保證我們的資料庫連線不能被發現。必須確保我們的資料庫不能暴露出去,第二
15個頂級Java多執行緒面試題及回答(高階java工程師)
Java 執行緒面試問題 在任何Java面試當中多執行緒和併發方面的問題都是必不可少的一部分。如果你想獲得任何股票投資銀行的前臺資訊職位,那麼你應該準備很多關於多執行緒的問題。在投資銀行業務中多執行緒和併發是一個非常受歡迎的話題,特別是電子交易發展方面相關的。他們會問面
iOS音訊學習筆記一:常見音訊封裝格式及編碼格式
(1) pcm格式 pcm是經過話筒錄音後直接得到的未經壓縮的資料流 資料大小=取樣頻率*取樣位數*聲道*秒數/8 取樣頻率一般是22k或者44k,位數一般是8位或者16位,聲道一般是單聲道或者雙聲道 pcm屬於編碼格式,就是一串由多個樣本值組成的資料流, 本身沒有任何頭資
微軟的字串問題(_T() 和_L() _TEXT __T,L及編碼)
C++主要使用的是C-Style字串,而M$在Windows中又增加了很多C-Style字串的變體。這個一多嘛,就容易亂~ 所謂字串,就是由字元組合而成,所以我們先來將將字元型別。 首先,存在兩種最基本的字元型別:char和wchar_t。char大家都很熟悉了,我就
sqli-labs————less 23(高階注入篇)
前言從這一關開始,我們進進入了短暫的高階注入部分,這一部分中將會陸續介紹一些更為巧妙的注入技巧。Less -23檢視一下原始碼:<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://
Vue2.0 UI框架Element運用之DateTimePicker(el-date-picker)初始值及時間格式轉化等細節問題
Element運用之DateTimePicke<el-date-picker>初始值預設值設定及時間轉化問題需求:點選更新資訊按鈕,彈出的對話方塊中的時間選擇器預設選擇當前時間(後端返回的是時間戳(this.plant.created_time))注:手冊裡面說的
js上傳檔案(圖片)限制格式及大小為3M · 觀止
如果你想快速解決這個問題,看本文就夠了。查了好多資料,終於解決了,太耗時間了,本文留給給後來者,希望你們工作的更輕鬆 本文儲存為.html檔案用瀏覽器開啟即可測試功能 <form id="fo
STM32學習--定時器(高階定時器)
高階定時器 1、功能增加 由上圖可瞭解到高階定時器在通用定時器上增加了三個功能部分: ① 時基部分:增加重複次數計數器和RCR暫存器。允許在指定數量的計數週期後產生更新事件,更新相應暫存器,其實際用處暫不瞭解,減少中斷或DMA處理的資源佔用? ②
Activiti 流程部署方式 activi 動態部署(高階原始碼篇)
Activiti的流程 部署方式有很多種方式,我們可以根據activit工作流引擎提供的ap方式進行部署。 當然了實際需求決定你要使用哪一種api操作,後面的總結詳細介紹了使用場景。 下面看一下部署方式。 流程部署的方式在類org.activiti.engine.rep
js上傳檔案(圖片)限制格式及大小
如果你想快速解決這個問題,看本文就夠了。查了好多資料,終於解決了,太耗時間了,本文留給給後來者,希望你們工作的更輕鬆 本文儲存為.html檔案用瀏覽器開啟即可測試功能 <form id="form1" name="form1" method="post" actio