Ios бесконечная видеозапись

Я пытаюсь разработать приложение для iPhone, которое будет использовать камеру для записи только последних нескольких минут/секунд. Например, вы записываете фильм в течение 5 минут, нажмите "сохранить", и будут сохранены только последние 30 секунд. Я не хочу на самом деле записывать пять минут, а затем нарезать последние 30 (это не работает для меня). Эта идея называется "Loop recording" .

Это приводит к бесконечной видеозаписи, но вы помните только последнюю часть. Приложение Precorder делает то, что я хочу делать. (Я хочу использовать эту функцию в другом контексте) Я думаю, что это должно быть легко смоделировано с помощью Circular buffer. Я начал проект с AVFoundation. Было бы замечательно, если бы я каким-то образом перенаправлял видеоданные в круговой буфер (который я буду реализовывать). Я нашел информацию только о том, как записать ее в файл.

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

Любые подсказки, как перенаправить данные с камеры, будут оценены.

Ответ 1

Важно! Начиная с iOS 8 вы можете использовать VTCompressionSession и иметь прямой доступ к блокам NAL вместо того, чтобы прорываться через контейнер.


Ну, к счастью, вы можете это сделать, и я расскажу вам, как, но вам придется загрязнять руки либо контейнером MP4, либо MOV. Полезный ресурс для этого (хотя и больше для MOV) - это руководство по быстрому форматированию файлов Apple Quicktime http://developer.apple.com/library/mac/#documentation/QuickTime/QTFF/QTFFPreface/qtffPreface.html#//apple_ref/doc/uid/TP40000939-CH202-TPXREF101

Во-первых, вы не сможете запустить сохраненный фильм с произвольной точки за 30 секунд до конца записи, вам нужно будет использовать некоторый I-Frame примерно через 30 секунд. В зависимости от вашего интервала ключевого кадра это может быть несколько секунд до или после этой отметки 30 секунд. Вы можете использовать все I-кадры и начинать с произвольной точки, но потом вы, вероятно, захотите снова закодировать видео, потому что оно будет довольно большим.

SO, зная, что, двигайтесь дальше.

Первый шаг - когда вы настроите свой AVAssetWriter, вам нужно будет установить для своего AVAssetWriterInput значение true для свойстваMediaDataInRealTime.

В обратном вызове captureOutput вы сможете сделать fread из файла, который вы пишете. Первый fread даст вам немного MP4/MOV (любой формат, который вы используете) header (т.е. Атом ftyp, "широкий" атом и начало атома "mdat" ). Вы хотите, что внутри раздела "mdat". Таким образом, смещение, которое вы начнете сохранять данные, составит 36 или около того.

В каждом чтении вы получите 0 или более единиц AVC NAL. Вы можете найти список типов единиц NAL из ISO/IEC 14496-10. Таблица 7-1. Они будут в немного другом формате, чем указано в Приложении B, но это хорошо. Кроме того, в файле MP4/MOV будут отображаться только фрагменты IDR и фрагменты без IDR. IDR будет I-Frame, на который вы хотите висеть.

Формат блока NAL в контейнере MP4/MOV выглядит следующим образом:

4 bytes - Size
[Size] bytes - NALU Data
data[0] & 0x1F - NALU Type

Итак, теперь у вас есть данные, которые вы ищете. Когда вы заходите, чтобы сохранить этот файл, вам нужно обновить контейнер MPV/MOV с правильной длиной, количеством отсчетов, вам нужно будет обновить атом "stsz" с правильными размерами для каждого образца, и такие вещи, как обновление заголовки мультимедиа и заголовки треков с правильной продолжительностью фильма и т.д. То, что я, вероятно, рекомендовал бы сделать, это создать образец контейнера при первом запуске, который вы можете более или менее просто перезаписать/увеличить с соответствующими данными для этого конкретного фильма. Вы захотите сделать это, потому что кодеры на разных iDevices не все имеют одинаковые настройки, а атом avcC содержит информацию о кодировщике.

В этом случае вам не нужно много знать о потоке AVC, поэтому вы, вероятно, захотите сконцентрировать свои эксперименты на обновлении выбранного вами формата контейнера. Удачи.