Запись 5-секундных сегментов аудио с помощью MediaRecorder, а затем загрузка на сервер

Вы можете использовать регулярное выражение, например:

(([0-1]?[0-9]{1,2}\.)|(2[0-4][0-9]\.)|(25[0-5]\.)){3}(([0-1]?[0-9]{1,2})|(2[0-4][0-9])|(25[0-5]))

Этот параметр подтверждает, что значения находятся в пределах диапазона.

Android поддерживает регулярные выражения. См. java.util.regex.Pattern .

class ValidateIPV4
{

   static private final String IPV4_REGEX = "(([0-1]?[0-9]{1,2}\\.)|(2[0-4][0-9]\\.)|(25[0-5]\\.)){3}(([0-1]?[0-9]{1,2})|(2[0-4][0-9])|(25[0-5]))";
   static private Pattern IPV4_PATTERN = Pattern.compile(IPV4_REGEX);

   public static boolean isValidIPV4(final String s)
   {          
      return IPV4_PATTERN.matcher(s).matches();
   }
}

Чтобы избежать повторной компиляции шаблона снова и снова, лучше всего поместить вызов Pattern.compile(), чтобы он выполнялся только один раз.

1
задан MM PP 13 July 2018 в 12:29
поделиться

1 ответ

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

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

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

API MediaRecorder находится здесь странно, так как он должен одновременно записывать эти метаданные , а также добавлять неопределенные данные (это live рекордер).

Итак, что происходит, так это то, что браузеры помещают основные метаданные в начале файла, таким образом, что они смогут просто нажимать новые данные на файл и по-прежнему быть допустимым файлом (даже если некоторая информация, подобная длительности, будет отсутствовать).

Теперь то, что вы получаете в datavailableEvent.data, является лишь частью целого файла, который генерируется , Первый, как правило, содержит метаданные и некоторые другие данные, в зависимости от того, когда событие было вызвано, но следующие части не обязательно будут содержать метаданные.

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

< hr>

Итак, к вашей проблеме у вас есть разные возможные подходы:

  • Вы можете отправить на свой сервер последние фрагменты, которые вы получили с вашего рекордера, в течение интервала и объединить эти сервер- боковая сторона.
    const recorder = new MediaRecorder(stream);
    const chunks = [];
    recorder.ondataavailable = e => chunks.push(e.data);
    recorder.start(); // you don't need the timeslice argument
    setInterval(()=>{
      // here we both empty the 'chunks' array, and send its content to the server
      sendToServer(new Blob(chunks.splice(0,chunks.length)))
    }, 5000);
    
    И на вашей стороне сервера вы добавите вновь отправленные данные в записываемый файл.
  • Другим способом было бы создание большого количества небольших автономных файлов, и для этого вы могли бы просто создать новый MediaRecorder за один интервал:
    function record_and_send(stream) {
       const recorder = new MediaRecorder(stream);
       const chunks = [];
       recorder.ondataavailable = e => chunks.push(e.data);
       recorder.onstop = e => sendToServer(new Blob(chunks));
       setTimeout(()=> recorder.stop(), 5000); // we'll have a 5s media file
       recorder.start();
    }
    // generate a new file every 5s
    setInterval(record_and_send, 5000);
    
    . Таким образом, каждый файл будет автономным, с длительностью около 5 секунд, и вы сможете воспроизводить эти файлы по одному. Теперь, если вы хотите хранить только один файл на сервере, все еще используя этот метод, вы можете очень хорошо объединить эти файлы на стороне сервера, используя, например, инструмент, например ffmpeg .
2
ответ дан Kaiido 17 August 2018 в 12:53
поделиться
  • 1
    Большое спасибо за ваш ответ! Да, мне нужно, чтобы каждый сегмент аудио воспроизводился. Я использовал первый метод, но сегменты не воспроизводятся отдельно. Если я использую второй метод, и я начинаю и останавливаю рекордер, каждый сегмент воспроизводится, так что это хорошо, но когда мне нужно присоединиться к ним, тогда есть «drop, clack, pac». звук между каждым из сегментов. Hmmm ... Есть ли возможность использовать первый метод, а также скопировать и вставить метаданные (или что-то еще) из первого файла во все остальные сегменты? Большое спасибо! – MM PP 16 July 2018 в 07:40
  • 2
    @MMPP на самом деле нет. Третий способ, который я не включал в ответ, - это фактически сделать оба одновременно: запустить один цикл, который будет записывать короткие последовательности, и более крупный, который будет производить полную отсроченную запись. (Только отправьте куски с полного на ваш сервер) – Kaiido 16 July 2018 в 07:42
  • 3
    Я думал раньше, чтобы создать щедрость, если я не получу ответа (потому что это было срочно). Итак, когда вы ответили на вопрос, прежде чем я смог начать щедрость, я хочу предложить вам 50 из моей репутации (через ~ 23 часа). Спасибо! – MM PP 16 July 2018 в 07:49
  • 4
    Третий способ - действительно хороший вариант! Действительно хорошая идея! Спасибо огромное! – MM PP 16 July 2018 в 07:49
Другие вопросы по тегам:

Похожие вопросы: