webm提取aac时,持续时间不一致

时间:2019-07-25 09:17:53

标签: google-chrome-extension ffmpeg aac webm web-mediarecorder

当我尝试从webm提取aac时,持续时间会不一致。 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. audioBits:128000
  5. videoBits: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.

但无一例外,都失败了。这个问题困扰了我四天。

webm文件下载URL:https://drive.google.com/file/d/1m4fC1hU-tXFPOZayrYCs-yteSTxw_TaW/view?usp=sharing

1 个答案:

答案 0 :(得分:3)

许多会议或网络录制应用程序所做的是,当音频输入丢失或静音(由某些音量阈值定义)时,静音不会存储静音。 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

后一个命令可能仍然显示错误的估计持续时间,但是编辑器在生成峰值后将显示正确的持续时间。