Я пытаюсь разобрать кадры H.264 из файла .mov. Я думаю, что пришел к выводу, что mov.c из AVFormat-части FFMPEG - это путь. Но mov.c - это ~ 2600 строк рядом с некомментированным кодом. Я ищу примеры использования FFMPEG, особенно разбора структуры любого типа файла. не имеет значения, MPEG4 или Quicktime Movie, поскольку они очень похожи по структуре.
если не существует существующих примеров (я не могу их найти), может быть, кто-то использовал их и может дать мне пару строк кода или объяснить, как начать работу?
Что я пытаюсь сделать:
я использую AVCaptureSession для захвата образцов с видеокамеры, эти образцы затем кодируются в H264 и записываются в файл с помощью AVAssetsWriter, AVAssetsWriterInput и AVAssetsWriterInputPixelBufferAdaptor. Причина в том, что я не могу получить доступ к аппаратной кодировке H264 напрямую, так как Apple не позволит этого. То, что мне теперь нужно сделать ( я думаю, что не уверен ), это разобрать:
Атом " mdat " (данные фильма, их может быть несколько) из файла .mov.
затем атом " vide " - и затем внутри видеоатома (выборка видеоданных может быть более одного). Я думаю, что будет несколько атомов, которые, как я верю, это рамки. они будут иметь тип "avc1" (это тип для H264). Пожалуйста, исправьте меня в этом, потому что я совершенно уверен, что еще не все правильно понял .
Мой вопрос: как мне разобрать отдельные кадры? Я читал документацию и смотрел на 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)