Аудио, записанное с помощью MediaRecorder в Chrome, отсутствует

Я записываю аудиофайлы (oga / vorbis) с помощью MediaRecorder. Когда я записываю этот файл через Chrome, у меня возникают проблемы: я не могу редактировать файлы в ffmpeg, и когда я пытаюсь воспроизвести их в Firefox, он говорит, что они повреждены (хотя они отлично воспроизводятся в Chrome).

Глядя на их метаданные на ffmpeg, я получаю следующее:

Input #0, matroska,webm, from '91.oga':
  Metadata:
    encoder         : Chrome
  Duration: N/A, start: 0.000000, bitrate: N/A
    Stream #0:0(eng): Audio: opus, 48000 Hz, mono, fltp (default)
[STREAM]
index=0
codec_name=opus
codec_long_name=Opus (Opus Interactive Audio Codec)
profile=unknown
codec_type=audio
codec_time_base=1/48000
codec_tag_string=[0][0][0][0]
codec_tag=0x0000
sample_fmt=fltp
sample_rate=48000
channels=1
channel_layout=mono
bits_per_sample=0
id=N/A
r_frame_rate=0/0
avg_frame_rate=0/0
time_base=1/1000
start_pts=0
start_time=0.000000
duration_ts=N/A
duration=N/A
bit_rate=N/A
max_bit_rate=N/A
bits_per_raw_sample=N/A
nb_frames=N/A
nb_read_frames=N/A
nb_read_packets=N/A
DISPOSITION:default=1
DISPOSITION:dub=0
DISPOSITION:original=0
DISPOSITION:comment=0
DISPOSITION:lyrics=0
DISPOSITION:karaoke=0
DISPOSITION:forced=0
DISPOSITION:hearing_impaired=0
DISPOSITION:visual_impaired=0
DISPOSITION:clean_effects=0
DISPOSITION:attached_pic=0
TAG:language=eng
[/STREAM]
[FORMAT]
filename=91.oga
nb_streams=1
nb_programs=0
format_name=matroska,webm
format_long_name=Matroska / WebM
start_time=0.000000
duration=N/A
size=7195
bit_rate=N/A
probe_score=100
TAG:encoder=Chrome

Как видите, есть проблемы с продолжительностью. Я просмотрел такие сообщения: Как добавить заданную длину к аудиозаписи, записанной с помощью MediaRecorder, в Chrome?

Но даже при этом у меня возникали ошибки при попытке разделить и объединить файлы, например, при запуске:

ffmpeg -f concat  -i 89_inputs.txt -c copy final.oga

У меня много такого:

[oga @ 00000000006789c0] Non-monotonous DTS in output stream 0:0; previous: 57612, current: 1980; changing to 57613. This may result in incorrect timestamps in the output file.
[oga @ 00000000006789c0] Non-monotonous DTS in output stream 0:0; previous: 57613, current: 2041; changing to 57614. This may result in incorrect timestamps in the output file.
DTS -442721849179034176, next:42521 st:0 invalid dropping
PTS -442721849179034176, next:42521 invalid dropping st:0
[oga @ 00000000006789c0] Non-monotonous DTS in output stream 0:0; previous: 57614, current: 2041; changing to 57615. This may result in incorrect timestamps in the output file.
[oga @ 00000000006789c0] Timestamps are unset in a packet for stream 0. This is deprecated and will stop working in the future. Fix your code to set the timestamps properly
DTS -442721849179031296, next:42521 st:0 invalid dropping
PTS -442721849179031296, next:42521 invalid dropping st:0

Кто-нибудь знает, что нам нужно сделать с аудиофайлами, записанными из Chrome, чтобы они были полезны? Или возникла проблема с моей настройкой?

Рекордер js:

if (navigator.getUserMedia) {
  console.log('getUserMedia supported.');

  var constraints = { audio: true };
  var chunks = [];

  var onSuccess = function(stream) {
    var mediaRecorder = new MediaRecorder(stream);

    record.onclick = function() {
      mediaRecorder.start();
      console.log(mediaRecorder.state);
      console.log("recorder started");
      record.style.background = "red";

      stop.disabled = false;
      record.disabled = true;

      var aud = document.getElementById("audioClip");
      start = aud.currentTime;
    }

    stop.onclick = function() {
      console.log(mediaRecorder.state);
      console.log("Recording request sent.");
      mediaRecorder.stop();
    }

    mediaRecorder.onstop = function(e) {
      console.log("data available after MediaRecorder.stop() called.");

      var audio = document.createElement('audio');
      audio.setAttribute('controls', '');
      audio.setAttribute('id', 'audioClip');

      audio.controls = true;
      var blob = new Blob(chunks, { 'type' : 'audio/ogg; codecs="vorbis"' });
      chunks = [];
      var audioURL = window.URL.createObjectURL(blob);
      audio.src = audioURL;

      sendRecToPost(blob);   // this just send the audio blob to the server by post
      console.log("recorder stopped");

    }

person suppp111    schedule 27.10.2016    source источник
comment
Для тех из вас, кто обнаружил такую ​​же, досадно уникальную проблему, я предупредил об этой ошибке в Chrome, и они заменили мою ошибку на эту: bugs.chromium.org/p/chromium/issues/detail?id=642012 - я полагаю, они скажут здесь, если они решили это, но ничего пока что. Я в основном только что решил использовать только Firefox и позже рассмотрю альтернативы. Моя исходная ошибка находится по адресу: bugs.chromium.org/p/ хром / issues / detail? id = 658149 # c3   -  person suppp111    schedule 05.01.2017


Ответы (1)


В документации ffmpeg я обнаружил, что мы можем установить метаданные при преобразовании с помощью этой опции:

//-metadata[:metadata_specifier] key=value (output,per-metadata)
//Set a metadata key/value pair.

ffmpeg -i in.avi -metadata title="my title" out.flv

Вы также можете проверить, работает ли лимит конверсии продолжительности в вашем случае:

//-t duration (input/output)
//When used as an input option (before -i), limit the duration of data read from the input file.

//When used as an output option (before an output url), stop writing the output after its duration reaches duration.
person Guilherme Câmara    schedule 03.06.2017