Я разрабатываю приложение, которое требует, чтобы я записывал много видеоданных, но мне не нужно их хранить. Что мне нужно сделать, так это сохранить только последние 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: Для того, чтобы быть ясным, я использовал слово «запись», а не «записанный» один сигнал. Я говорю об обрезке видео, пока он все еще записывается! Речь идет не о редактировании, если она была сохранена, но что-то более похожее на удаление материала из потока, когда я пишу его на диск.
Идея звучит круто, я попробую ее как можно скорее, и я сообщу, когда закончим – StepTNT
Есть ли у вас все обновления об этом? – CAMOBAP