在ffmpeg标准版中已经存在mlp音频解码器,但却没有编码器,但在soc版本中是有的,且有一个专门的目录mlp存放。
和其它编码器,mlp编码的相关文件是mlpenc.h和mlpenc.c,但在soc中不能直接加入,需要在接口上加以更改,改接口是mlp_encode_frame,细心的开发人员不难发现,他们是不一样的。 在soc或早期版本中如下:
int (*encode)(AVCodecContext *,
uint8_t *buf,
int buf_size,
void *data);
后来使用了encode2,其定义如下:
int(*encode2)(AVCodecContext*avctx,
AVPacket*avpkt,
constAVFrame*frame,
int*got_packet_ptr);
在avcodec.h中当然也必须更改REGISTER_DECODER(MLP,mlp)更改为REGISTER_ENCDEC(MLP, mlp).
有测试过的同学也发现这个mlp编码器并不能在ts或m2ts中进行复用流的编码,这是因为在复合流中使用的是其复杂形式,名称为trueHD.
所以在同步头中还应根据mlp还是trueHD作一点更改,当然这一点根据只能编码出trueHD的裸流音频。
如果直接使用-i filename -avcodec truehd -ac2 outpath/outname.m2ts,播放时会没有声音,这是为什么呢?
这是因为在ffmpeg中并没有对turehd的流进行标识,正确的做法是在节目表中写入truehd的标识0x83,如此便能成功。
补充说明:mlp的fourCC('M','L','P',' ' ), trueHD的fourCC('T','R','H','D').