Java - xuggle / ffmpeg - атом mov не найден - PullRequest
1 голос
/ 30 мая 2011

Я пытаюсь прочитать файл MOV из локального с помощью Xuggle. Это дает мне следующую ошибку:

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 голосов
/ 05 сентября 2011

Только что разобрался с этой проблемой.
Прежде чем использовать контейнер, сначала установите его размер буфера

container.setInputBufferLength(b.available());
0 голосов
/ 05 декабря 2013

Я понимаю, что это старая ветка, но я натолкнулся на нее, исследуя собственную проблему, и ни одно из вышеперечисленных решений не помогло.

В моем случае у меня были проблемы с файлами H264 / mov, которые были переданы через Adobe Media Encoder. Оказывается, AME поставил MOOV ATOM там, где Xuggle не мог его найти. Я предполагаю в конце файла.

Решение для меня было двояким. A) Мне нужно было передать Xuggle файл RandomAccessFile, чтобы он мог искать взад и вперед, чтобы найти MOOV ATOM. (FileInputStreams не доступны для поиска) B) Я должен был настроить формат Контейнера, большая часть документации и учебных пособий оставила это как пустое значение, полагаясь на 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);

Надеюсь, это кому-нибудь поможет.

0 голосов
/ 05 сентября 2011

Когда вы назначаете ByteArrayInput для DataInputStream, он может потерять некоторые данные.Проверьте, совпадает ли их значение avaiable ().

...