когда webm извлекает aac, продолжительность несовместима

Когда я пытаюсь извлечь aac из webm, будут несоответствия продолжительности. aac на десять минут меньше. Разные webm видео, зазор не тот.

webm видео создается с помощью chrome extension chrome.tabCapture.capture

код:

chrome.tabCapture.capture({
  video: true,
  audio: true,
  videoConstraints: {
    mandatory: {
      minWidth: 1920,
      minHeight: 1080,
      maxWidth: 1920,
      maxHeight: 1080,
      maxFrameRate: 30,
      minFrameRate: 30,
    }
  }
})

Приведенный выше код вернет поток, я буду использовать JS MediaRecorder, чтобы обработать этот поток и, наконец, сохранить его как файл webm.

код:

new MediaRecorder(stream, {
  audioBitsPerSecond: 128000,
  videoBitsPerSecond: 2500000,
  mimeType: 'video/webm;codecs=vp9'
})

Если вы не знаете значение приведенного выше кода, не беда, поясню основную информацию:

  1. ширина: 1920
  2. рост: 1080
  3. FPS: 30
  4. аудиобиты: 128000
  5. биты видео: 2500000
  6. mimeType: video/webm;codecs=vp9

Я пробовал много методов, например, следующие:

# 1
ffmpeg -i ./source.webm -y -fflags +genpts -max_muxing_queue_size 99999 -r 15 -crf 30 -filter:v crop=750:560:0:0 ./x.mp4
ffmpeg -i ./x.mp4 -y -vn -acodec libfdk_aac -b:a 200k ./x.aac

# 2
ffmpeg -i ./source.webm -y -vn -acodec libfdk_aac -b:a 200k ./x.aac

# 3
ffmpeg -i ./source.webm -y -vn -acodec libfdk_aac -b:a 200k -map 0 ./x.aac

# 4
ffmpeg -i ./source.webm -y -max_muxing_queue_size 99999 -r 15 -crf 30 -filter:v crop=750:560:0:0 ./x.mp4
ffmpeg -i ./source.webm -y -vn -acodec aac -b:a 200k ./x.aac

# etc.

Но все без исключения провалились. Мучаюсь с этой проблемой 4 дня.

URL-адрес загрузки веб-файла: https://drive.google.com/file/d/1m4fC1hU-tXFPOZayrYCs-yteSTxw_TaW/view?usp=sharing


person Black-Hole    schedule 25.07.2019    source источник
comment
Похоже на ошибку в Chrome, о которой вы можете сообщить на crbug.com.   -  person wOxxOm    schedule 25.07.2019
comment
Вы не можете извлечь необработанный битовый поток из контейнера и ожидать, что временные метки останутся.   -  person Brad    schedule 25.07.2019


Ответы (1)


То, что делают многие приложения для конференций или веб-записи, не сохраняют тишину, когда аудиовход отсутствует или молчит (как определено некоторым порогом громкости). WebM и MP4 являются контейнерами с временной индексацией, поэтому медиаданные имеют правильные временные метки для целей воспроизведения или редактирования. .mp3 или .aac нет, поэтому без временных меток продолжительность равна фактическому количеству записанного и сохраненного звука. Дополнительная проблема заключается в том, что продолжительность, которую вы видите с помощью ffmpeg -i in.aac, является оценкой, основанной на размере файла и условном битрейте. Для потока VBR эта оценка может быть ошибочной.

Либо храните и работайте со звуком в контейнере с временными метками, такими как MP4, MKV и т. д.

ffmpeg -i ./x.mp4 -y -vn -acodec libfdk_aac -b:a 200k ./x.mp4

или заполните пробелы временных меток звуковой тишиной,

ffmpeg -i ./x.mp4 -y -vn -af aresample=async=1:first_pts=0:min_hard_comp=0.01 -acodec libfdk_aac -b:a 200k ./x.aac

Эта последняя команда может по-прежнему отображать неправильную расчетную продолжительность, но редактор после генерации пиков покажет правильную продолжительность.

person Gyan    schedule 25.07.2019
comment
ты спас меня.. Большое спасибо. - person Black-Hole; 26.07.2019
comment
Я проверил и обнаружил, что первый не имеет никакого эффекта, а второй не вызывает проблем. - person Black-Hole; 26.07.2019
comment
Когда я использовал второй метод для извлечения aac, проблем с длительностью не было. Но звук внутри будет прерывистым. Это еще один файл AAC, который я извлек: drive.google.com/ file/d/1W9QW_NHN-CXJ5CWV9edQL3LNbwdFv5Ga/ (начиная с 5 минут 14 секунд) - person Black-Hole; 26.07.2019
comment
Хорошо, я посмотрел на source.webm, и аудиопоток в порядке, но временные метки для аудио и видео неверны. Воспроизведение видео происходит быстрее, чем в реальном времени. ffmpeg также жалуется на метаданные файла: Length 5 indicated by an EBML number's first byte 0x0c at pos 15688587 (0xef638b) exceeds max length 4 и Invalid length 0x149d > 0x8 for element with ID 0xE7 at 0x1872992 - person Gyan; 26.07.2019
comment
Есть ли способ решить эту проблему? Потому что звук теперь имеет заметное прерывистое ощущение - person Black-Hole; 26.07.2019
comment
Промежутки временных меток аудио не должны быть заполнены (что делает моя вторая команда), потому что временные метки неверны. Видео нужно исправить. Я посмотрю на это позже сегодня. - person Gyan; 26.07.2019
comment
Большое спасибо за Вашу помощь. Если вам понадобится какая-либо дополнительная информация от меня, я предоставлю ее немедленно. - person Black-Hole; 26.07.2019
comment
Продолжительность видео по наложенным часам выглядит правильно. Но воспроизведение слишком быстрое. Я бы посчитал это ошибкой с плагином и должен быть исправлен там. - person Gyan; 27.07.2019
comment
Хорошо спасибо большое. Другими словами, FFmpeg не может решить эту проблему? - person Black-Hole; 27.07.2019
comment
Если бы характер искажения метки времени/шкалы времени был известен, его можно было бы исправить. Поднимите вопрос с автором расширения. - person Gyan; 27.07.2019
comment
Хорошо, большое спасибо. Я решил проблему неправильного размещения аудио и видео webm. В настоящее время второй метод может использоваться для выравнивания без каких-либо других побочных эффектов. Несовпадение аудио и видео WebM вызвано одновременной записью нескольких файлов. - person Black-Hole; 27.07.2019
comment
@Gyan Метод 2. также работает для моего дела, но я также получил много вырезок. Даже на неповрежденных частях моего видео. В любом случае спасибо большое! Моя тема: stackoverflow.com/questions/64606142/ - person user2029101; 02.11.2020
comment
Изменить async=1 на async=3072 - person Gyan; 04.11.2020