Я пытаюсь разобрать кадры H.264 из файла .mov. Думаю, я пришел к выводу, что mov.c из AVFormat-части FFMPEG - это путь. Но mov.c составляет ~ 2600 строк рядом с незарегистрированным кодом. Я ищу примеры использования FFMPEG, особенно для синтаксического анализа структуры любого типа файла. неважно, является ли это MPEG4 или Quicktime Movie, поскольку они очень похожи по своей структуре.Анализ по кадру из .mov с использованием ffmpeg
Если нет существующих примеров (я не могу найти их), возможно, кто-то использовал его и может дать мне пару строк кода или объяснить, как начать работу?
То, что я пытаюсь сделать: я использую AVCaptureSession для захвата образцов с видеокамеры, эти образцы затем кодируются в H264 и записываются в файл с помощью AVAssetsWriter, AVAssetsWriterInput и AVAssetsWriterInputPixelBufferAdaptor. Причина в том, что я не могу получить доступ к аппаратной кодировке H264 напрямую, так как Apple этого не допустит. Что теперь мне нужно сделать (я думаю, не уверен) это разобрать:
The «MDAT» -атом (данные Movie, может быть больше, чем один я думаю) из файла .mov. , тогда «vide» -атом, а затем в виде-атоме (образец видеоданных может быть более одного). Я думаю, что будет несколько атомов, которых я считаю рамками. они будут иметь тип «avc1» (это тип для H264). Пожалуйста, исправьте меня в этом, потому что я абсолютно уверен, что я не получил все это правильно, но.
Мой вопрос в том, как я могу разобрать отдельные кадры. Я читал the documentation и смотрел iFrameExtractor (что не очень полезно, так как он декодирует кадры). Я думаю, что правильно понял, когда я должен использовать mov.c из FFMPEG-AVFormat, но я не уверен.
Edit: Я сейчас пытаюсь так:
я бегу немного уменьшенную функцию инициализации я iFrameExtractor, который находит видеопоток в .mov-файл.
я получаю данные для кадра, как это:
AVPacket packet; av_read_frame(pFormatCtx, &packet); NSData *frame; if(packet.stream_index == videoStream){ frame = [NSData dataWithBytes:packet.data length:packet.size]; } videoStream++; av_free_packet(&packet); return frame;
я затем передать его в подкласс NSOperation, где он сохраняется в ожидании загрузки. , но я получаю EXC_BAD_ACC, неужели я что-то делаю неправильно при копировании данных из фрейма? есть идеи. Я получаю EXC _..., когда пытаюсь установить переменную класса NSData* frame
, используя ее (неатомное, сохраняющее) свойство. (он говорит EXC_BAD_ACC в строке синтеза)
mov.c не поможет вам с достижением цели. Если вам нужна помощь по разборке MOV/MP4, это может быть удобно. Еще одна удобная библиотека, когда ситуация становится грубой [mp4v2] (http://code.google.com/p/mp4v2/). В основном вам придется писать это самостоятельно. Никакая библиотека не собирается выполнять работу по разным причинам. –
@Steve McFarlin, спасибо, у вас есть какие-то советы по чтению, кроме qt-документации, чтобы понять всю структуру mov-файла, потому что у меня действительно возникают проблемы с захватом всего этого, правильно ли это, что атом даже не должны быть в определенном порядке? какой, по вашему мнению, было проще всего работать с mov или mp4? –
@Steve McFarlin, я думаю, вы видели проект iFrameExtractor. это также по сути тот же код, что и в учебнике Мартина Бёма (например, на dranger.com). в следующей функции кадра они используют только av_read_frame, а затем декодируют это. не будет ли AVPacket изменен av_read_frame закодированным H264-кадром? –