Java - xuggle / ffmpeg - 找不到mov atom

时间:2011-05-30 14:08:41

标签: java ffmpeg xuggle

我正在尝试使用Xuggle从本地读取一个mov文件。 这给了我以下错误:

30-mag-2011 15.56.55 com.xuggle.ferry.NativeLogger log
GRAVE: [mov,mp4,m4a,3gp,3g2,mj2 @ 0x102840600] moov atom not found

问题是,在它没有发出任何错误并且代码是相同的两分钟之前。

然而,我发现了这个:

如果我使用字节数组打开IContainer它不起作用并给我错误:

ByteArrayInputStream b = new ByteArrayInputStream(file);
DataInputStream data = new DataInputStream(b);
IContainer container = IContainer.make();
if (container.open(data, null) < 0)
    throw new IllegalArgumentException("E001 - Cannot open the container");

如果我使用临时文件打开IContainer,它就可以工作。

File temp = File.createTempFile("temp_", ".mov");

try
{
    FileOutputStream fos = new FileOutputStream(temp);
    fos.write(file);
    fos.close();
}
catch(FileNotFoundException e)
{
    System.out.println(e);
}

IContainer container = IContainer.make();

if (container.open(temp.toString(), IContainer.Type.READ, null) < 0)
    throw new IllegalArgumentException("E001 - Cannot open the container");

有什么建议吗?

3 个答案:

答案 0 :(得分:0)

将ByteArrayInput分配给DataInputStream时,可能会丢失一些数据。检查它们的avaiable()值是否相同。

答案 1 :(得分:0)

刚刚发现了这个问题 在使用容器之前,首先设置其缓冲区大小

container.setInputBufferLength(b.available());

答案 2 :(得分:0)

我意识到这是一个老线程,但我在研究自己的问题时遇到了它,上面发布的解决方案都没有帮助。

在我的情况下,我遇到了通过Adobe Media Encoder传递的H264 / mov文件的问题。事实证明,AME将MOOV ATOM置于Xuggle无法轻易找到的位置。我猜测文件的末尾。

我的解决方案是双重的。 A)我需要传递Xuggle一个RandomAccessFile,以便它可以来回搜索以找到MOOV ATOM。 (FileInputStreams是不可搜索的)B)我必须配置Container格式,网上有很多文档和教程,因此依赖于Xuggle进行自动检测。

RandomAccessFile f = new RandomAccessFile("C:/MyMovie.mov", "r");
IContainer container = IContainer.make();
IContainerFormat format = IContainerFormat.make();
if (format.setInputFormat("mov") < 0) 
    System.out.println("Error setting format");

int result = container.open(f, IContainer.Type.READ, format);

希望这有助于某人。