【问题标题】:when webm extracts aac, the duration is inconsistentwebm提取aac时,duration不一致
【发布时间】:2019-07-25 09:17:53
【问题描述】:

当我尝试从webm 中提取 aac 时,持续时间会出现不一致。 aac 少了十分钟。不同的webm视频,差距不一样。

webm视频由chrome extensionchrome.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天。

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

【问题讨论】:

  • 听起来像是 Chrome 中的一个错误,您可以在 crbug.com 上报告。
  • 您无法将原始比特流从容器中提取出来并期望时间戳保留。

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


【解决方案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

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

【讨论】:

  • 你救了我。非常感谢。
  • 我测试了第一个没有效果,第二个也没问题。
  • 我用第二种方法提取aac时,duration没有问题。但里面的声音会断断续续。这是我提取的另一个aac文件:drive.google.com/file/d/1W9QW_NHN-CXJ5CWV9edQL3LNbwdFv5Ga/…(从5分14秒开始)
  • 好的,我查看了 source.webm 并且音频流很好,但是音频和视频的时间戳都是错误的。视频播放的速度比实时快。 ffmpeg 还抱怨文件元数据:Length 5 indicated by an EBML number's first byte 0x0c at pos 15688587 (0xef638b) exceeds max length 4Invalid length 0x149d > 0x8 for element with ID 0xE7 at 0x1872992
  • 有什么办法可以解决这个问题吗?因为现在声音有明显的断断续续的感觉
猜你喜欢
  • 1970-01-01
  • 2017-12-30
  • 2019-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-07
相关资源
最近更新 更多