博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
如何使用MP4SetTrackESConfiguration
阅读量:4183 次
发布时间:2019-05-26

本文共 2318 字,大约阅读时间需要 7 分钟。

在使用MP4v2制作.mp4档案时,如果你要使用的Audio编码格式是AAC,那么你就需要使用MP4SetTrackESConfiguration这个函式来设定解码需要的资料。在网路上看到的例子都是以FAAC编码为居多,大多都可以参考需要的设定,设定MP4SetTrackESConfiguration的方式,都是先利用FAAC里的  
faacEncGetDecoderSpecificInfo得到想要的资料,再传给 
MP4SetTrackESConfiguration 


像这样


faacEncGetDecoderSpecificInfo(hEnc, &Config, &ConfigLen);

MP4SetTrackESConfiguration(hFile, AudioTrack, Config, ConfigLen);


这是刚好你用的是FAAC library,但如果你用的是别的library该怎么办呢?

起初我也是试着去Google看看有没有人有提供这样的资料,后来在看到了有人说了大概的方式,但是我看了之后,并不了解它所说的格式怎么决定?我使用的参数不一定和它用的是一样的,所以我不能肯定要如何设定这个值。我也去Google了这个栏位的格式,但是没有找到,还去查了一下Apple Qiucktime档案格式的文件,也没发现什么。最后,我直接去看了FAAC的原始码,才了解怎么设定。(我应该一开始就看的...) 

faacEncGetDecoderSpecificInfo 的程式碼如下,可以看出我們要的格式是

5 bits | 4 bits | 4 bits | 3 bits

第一欄 第二欄 第三欄 第四欄

第一欄:AAC Object Type

第二欄:Sample Rate Index

第三欄:Channel Number

第四欄:Don't care,設 0


int FAACAPI faacEncGetDecoderSpecificInfo(faacEncHandle hEncoder,unsigned char** ppBuffer,unsigned long* pSizeOfDecoderSpecificInfo)
{
   BitStream* pBitStream = NULL;
   if((hEncoder == NULL) || (ppBuffer == NULL) || (pSizeOfDecoderSpecificInfo == NULL)) {
       return -1;
   }
   if(hEncoder->config.mpegVersion == MPEG2){
       return -2; /* not supported */
   }
   *pSizeOfDecoderSpecificInfo = 2;
   *ppBuffer = malloc(2);
   if(*ppBuffer != NULL){
       memset(*ppBuffer,0,*pSizeOfDecoderSpecificInfo);
       pBitStream = OpenBitStream(*pSizeOfDecoderSpecificInfo, *ppBuffer);
       PutBit(pBitStream, hEncoder->config.aacObjectType, 5);
       PutBit(pBitStream, hEncoder->sampleRateIdx, 4);
       PutBit(pBitStream, hEncoder->numChannels, 4);
       CloseBitStream(pBitStream);
       return 0;
   } else {
       return -3;
   }
}

接著,要知道怎麼決定每個欄位的值,第三和第四就不用看了,只要找出第一和第二欄位就行了。從原始碼裡找出下面的資料:


/* AAC object types */
#define MAIN 1
#define LOW  2
#define SSR  3
#define LTP  4

/* Returns the sample rate index */
int GetSRIndex(unsigned int sampleRate)
{
   if (92017 <= sampleRate) return 0;
   if (75132 <= sampleRate) return 1;
   if (55426 <= sampleRate) return 2;
   if (46009 <= sampleRate) return 3;
   if (37566 <= sampleRate) return 4;
   if (27713 <= sampleRate) return 5;
   if (23004 <= sampleRate) return 6;
   if (18783 <= sampleRate) return 7;
   if (13856 <= sampleRate) return 8;
   if (11502 <= sampleRate) return 9;
   if (9391 <= sampleRate) return 10;
   return 11;
}

現在,對於你自己要設定的參數值,就知道要怎麼設了吧!舉個例子,我使用的 AAC 是 LOW,44100 hz,Stereo,那麼從上面的資料來看

第一欄:00010

第二欄:0100

第三欄:0010

第四欄:000

合起來: 00010010 00010000 => 0x12 0x10

這樣就能找出你的選擇,需要對映什麼參數值了!

转载地址:http://wnzoi.baihongyu.com/

你可能感兴趣的文章
Google Guava官方教程(中文版)(转)
查看>>
【java开发系列】—— 自定义注解(转)
查看>>
创建虚拟机生成虚拟机全程日志打印输出流程详解(openstack开发必备)
查看>>
ESB简介及选型(转)
查看>>
JAVA编写HTTP代码并发布在网上
查看>>
JDBC连接数据库的原理和步骤
查看>>
开发微信公众平台的基本功能
查看>>
JSP内置对象的学习
查看>>
用java写文件输入输出流,实现复制粘贴的方法
查看>>
学习JSP的方法步骤(参考)
查看>>
JSP中常见TOMCAT错误代码原因
查看>>
MyEclipse中WEB项目加载mysql驱动方法
查看>>
常见编写JAVA报错总结
查看>>
org.gjt.mm.mysql.Driver和com.mysql.jdbc.Driver的区别
查看>>
UTF-8和GBK有什么区别
查看>>
增加MyEclipse分配内存的方法
查看>>
头痛与早餐
查看>>
[转]在ASP.NET 2.0中操作数据::创建一个数据访问层
查看>>
[转]高并发高流量网站架构
查看>>
[转]高效存储技术研究
查看>>