webm提取aac时时长不一致
when webm extracts aac, the duration is inconsistent
当我尝试从 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,
}
}
})
上面的代码会return一个流,我会用JS的MediaRecorder方法来处理这个流,最后保存为webm文件。
代码:
new MediaRecorder(stream, {
audioBitsPerSecond: 128000,
videoBitsPerSecond: 2500000,
mimeType: 'video/webm;codecs=vp9'
})
如果你不明白上面代码的意思,没关系,我会解释主要信息:
- 宽度:
1920
- 身高:
1080
- 每秒帧数:
30
- 音频位:
128000
- 视频位:
2500000
- mime 类型:
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文件下载url:https://drive.google.com/file/d/1m4fC1hU-tXFPOZayrYCs-yteSTxw_TaW/view?usp=sharing
许多会议或网络录制应用程序所做的,不是在音频输入丢失或静音(由某些音量阈值定义)时存储静音。 WebM 和 MP4 是 time-indexed 容器,因此媒体数据具有用于播放或编辑目的的正确时间戳。 .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
后一个命令可能仍会显示错误的估计持续时间,但编辑器在生成峰值后会显示正确的持续时间。
当我尝试从 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,
}
}
})
上面的代码会return一个流,我会用JS的MediaRecorder方法来处理这个流,最后保存为webm文件。
代码:
new MediaRecorder(stream, {
audioBitsPerSecond: 128000,
videoBitsPerSecond: 2500000,
mimeType: 'video/webm;codecs=vp9'
})
如果你不明白上面代码的意思,没关系,我会解释主要信息:
- 宽度:
1920
- 身高:
1080
- 每秒帧数:
30
- 音频位:
128000
- 视频位:
2500000
- mime 类型:
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文件下载url:https://drive.google.com/file/d/1m4fC1hU-tXFPOZayrYCs-yteSTxw_TaW/view?usp=sharing
许多会议或网络录制应用程序所做的,不是在音频输入丢失或静音(由某些音量阈值定义)时存储静音。 WebM 和 MP4 是 time-indexed 容器,因此媒体数据具有用于播放或编辑目的的正确时间戳。 .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
后一个命令可能仍会显示错误的估计持续时间,但编辑器在生成峰值后会显示正确的持续时间。