Xuggler的IPacket如何与FLV标签或标签部件相对应?

时间:2012-04-03 16:09:58

标签: java audio ffmpeg flv xuggle

FLV格式规范在此处:http://www.adobe.com/content/dam/Adobe/en/devnet/flv/pdfs/video_file_format_spec_v10.pdf

1)FLV主体由标签

组成

2)每个标签由标题和数据

组成

3)数据可能是AUDIODATAVIDEODATA

4)AUDIODATA由描述符字节和音频帧组成。

我的问题是:用Xuggler阅读FLV时IPacket中的内容是什么?

目前我在代码中从AUDIODATA中提取音频帧。我分析第一个字节,推断格式,剪切其他数据,将其包装到IPacket并将其发送到IStreamCoder解码器,该解码器采用推导格式设置。

但可能我可以把这个委托给Xuggler?也许我可以创建FLV格式的IContainer并从中查看数据包?

假设我将InputStream传递给IContainer。这个流可以只包含FLV体吗?它会正确提取音频包吗?

1 个答案:

答案 0 :(得分:1)

Xuggler中的IContainer对象将解析FLV流并使用它来确定容器中的IStream。然后,当您从IContainer读取每个数据包时,请检查IPacket#getStreamIndex()值。这为您提供了流#,然后您可以在IContainer上使用它来获取带有元数据的IStream对象。

IPacket#getData()方法将返回音频的有效负载,但不返回任何头字节。这是因为IContainer / IStream对象占用了这些字节(并且它们不能通过Xuggler独立访问)。

所有这一切都有效,因为IContainer委托FFmpeg的libavformat C代码完成解析FLV流的工作(由VLC,mPlayer和各种其他库使用)。

希望有所帮助,

技术