2013-09-21 4 views
2

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

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

Так я начал работать с этой статьей: http://msdn.microsoft.com/library/windowsphone/develop/hh394041%28v=vs.105%29.aspx

Первая мысль, что у меня было просто назвать StopVideoRecording(), а затем StartVideoRecording() с помощью таймера каждые X минут.

Теперь, сначала это имело смысл, но это не сработает.

Проблема заключается в том, что при этом удаляются предыдущие данные каждые Х минут.

Это означает, что если мы запишем 12 минут, и нам нужно сохранить последние 5, следуя этой идее, мы удалим первые 5, а затем вторую пятерку, оставив только последние 2 минуты, и это не то, что я искал.

Я переехал затем мое внимание к классу VideoSink из-за метода OnSample.

Это кажется довольно простым, мы перехватываем каждый образец, и мы храним его в массиве байтов фиксированного размера (размер зависит от необходимой длины и размера выборки).

Когда буфер заполнен, мы просто сдвинем все слева, прежде чем добавлять новый образец. Проблема заключается в том, что тестовое видео всего за 1 минуту сгенерировало что-то вроде 2GB образцов, и это делает этот процесс очень трудным для управления.

Я знаю, что эти сэмплы несжаты, но для смартфона не было бы сложно получить образец, сжать его, сместить большой массив, вставить образец и записать массив в файл и сделать это на КАЖДЫЙ образец получен?

Да, я говорю о написании массива в файл, потому что нам нужно как-то упорствовать в этом видео. Может случиться так, что батарея перестанет работать, а наличие ее в ОЗУ позволит нам потерять все, что мы записали!

Последняя идея, которая пришла на ум, состояла в том, чтобы использовать комбо VideoSink и FileSink. В то время как FileSink делает магию сжатия (я даже декомпилировал этот класс, чтобы понять, что он делает, но внутри не существует кода!), Мы используем метод 4 для ручного удаления ненужных данных из файла mp4, используемого FileSink.

Это звучит довольно сложно, потому что я не знаю, могу ли я записать файл с и VideoSink без проблем с параллелизмом, и я не нашел хорошую библиотеку C#, чтобы помочь мне работать с файлами mp4 без имея дело со своей структурой. Единственная библиотека, которую я нашел, - это номер http://basemedia.codeplex.com/, но ей не хватает документации (каждая ссылка на странице документации дает ошибку 404).

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

EDIT: Для того, чтобы быть ясным, я использовал слово «запись», а не «записанный» один сигнал. Я говорю об обрезке видео, пока он все еще записывается! Речь идет не о редактировании, если она была сохранена, но что-то более похожее на удаление материала из потока, когда я пишу его на диск.

ответ

1

Я не могу предоставить вам код, а просто идею. Поскольку у вас есть требования:

  1. Мне нужно только сохранить последний записанный поток X minutes.
  2. Целевой платформа windows phone 8

Я хочу добавить некоторые изменения в ваши первые идеи:

  1. Напишите каждую минуту видеопотока в отдельном файле
  2. Кроме того, необходимо оставить +1 видео более чем на несколько минут. Например, если вам нужно 5 минут, вы всегда должны хранить 6 файлов, потому что последний файл может быть не заполнен.
  3. С помощью DirectShow вы можете присоединиться к этим файлам в одном. Будьте готовы к использованию C++ (В качестве альтернативы этому вы можете воспользоваться некоторыми услугами или сделать собственный исходный код для этого)
+0

Идея звучит круто, я попробую ее как можно скорее, и я сообщу, когда закончим – StepTNT

+0

Есть ли у вас все обновления об этом? – CAMOBAP

Смежные вопросы