音频与 avconv 命令不同步

音频与 avconv 命令不同步

我目前正在尝试将来自不同设备的多个视频合并为一个视频。设置如下:

  1. 用户在手机上录制了 3 个视频(Android 或 iOS)
  2. 系统将这些视频(mp4 格式)发送到我们的服务器
  3. 服务器移动文件并将其转换为 TS 文件(为什么?因为我们认为将每个视频格式化为这种格式会很好)

完成这些步骤后,我们想将其与 4 个视频合并。这意味着,通过将我们的视频命名为“ov”,最终合并步骤将是:

ov1 > sent video 1 > ov2 > sent video 2 > ov3 > sent video 3 > ov4

这确实带来了一些问题。我们一直用这些代码将每个视频格式化为相同的格式、相同的音频通道等等(唯一改变的是文件名)

avconv -ss 0 -i "48_0.85825500-14815530815710.mp4" -vcodec libx264 -acodec aac -bsf:a aac_adtstoasc -bsf:v h264_mp4toannexb -f mpegts -strict experimental -y "tmp_48_0.ts"

就我们而言,这意味着每个视频都将被编译为相同的视频(h264_mp4toannexb)和音频(aac_adtstoasc)格式。 像这样组合这些视频时,音频会不同步:

avconv -i concat:"2connect-ae.ts|tmp_48_1.ts" -c copy -bsf:a aac_adtstoasc -bsf:v h264_mp4toannexb -y "output.mp4"

我们一直在尝试以不同的方式、从不同的来源改变压缩/编译/转换视频的方式,但没有成功。我们从 Final Cut Pro 和 Adob​​e After Effects 导出了 4 个 .wov 文件。更改我们的工具没有用。

不知何故,我们的视频(ov1、ov2、ov3、ov4)的声音与用户发送的视频重叠,导致声音延迟,并且每一秒都在增加。我们有点困惑,为什么这种情况会一直发生,任何帮助都将不胜感激。

如果我们将发送的视频相互连接起来,则不会出现延迟。如果我们将自己的任何视频添加到列表中,音频就会开始延迟。如果您想了解更多信息,请告诉我。

有关我们版本的信息:

avconv version 9.11-6:9.11-2ubuntu2, Copyright (c) 2000-2013 the Libav developers built on Mar 24 2014 06:12:33 with gcc 4.8 (Ubuntu 4.8.2-17ubuntu1) avconv 9.11-6:9.11-2ubuntu2 libavutil 52. 3. 0 / 52. 3. 0 libavcodec 54. 35. 0 / 54. 35. 0 libavformat 54. 20. 3 / 54. 20. 4 libavdevice 53. 2. 0 / 53. 2. 0 libavfilter 3. 3. 0 / 3. 3. 0 libavresample 1. 0. 1 / 1. 0. 1 libswscale 2. 1. 1 / 2. 1. 1


编辑给定的评论:目前,我们正在尝试使用此选项将每个视频转换为相同的尺寸: -filter:v 'scale=iw*min(1920/iw\,1080/ih):ih*min(1920/iw\,1080/ih), pad=1920:1080:(1920-iw*min(1920/iw\,1080/ih))/2:(1080-ih*min(1920/iw\,1080/ih))/2'

每个视频都会转换为 1920x1080。我们还试图排除所有可用的选项,然后重新构建,看看哪里出了问题。但这似乎是一个巨大的进步,也是一种绝望的进步。


编辑2

这些是我们当前正在运行的命令:

avconv -i "33_0.98002500-14821542538733.mp4" -f mpegts -filter:v 'scale=iw*min(1920/iw\,1080/ih):ih*min(1920/iw\,1080/ih), pad=1920:1080:(1920-iw*min(1920/iw\,1080/ih))/2:(1080-ih*min(1920/iw\,1080/ih))/2' "tmp_ruud_0.ts"
avconv -i "33_0.57471800-14821542544448.mp4" -f mpegts -filter:v 'scale=iw*min(1920/iw\,1080/ih):ih*min(1920/iw\,1080/ih), pad=1920:1080:(1920-iw*min(1920/iw\,1080/ih))/2:(1080-ih*min(1920/iw\,1080/ih))/2' "tmp_ruud_1.ts"
avconv -i "33_0.27939600-14821542541226.mp4" -f mpegts -filter:v 'scale=iw*min(1920/iw\,1080/ih):ih*min(1920/iw\,1080/ih), pad=1920:1080:(1920-iw*min(1920/iw\,1080/ih))/2:(1080-ih*min(1920/iw\,1080/ih))/2' "tmp_ruud_2.ts"

avconv -i "templates/v2/wiebenik-v2.mov" -f mpegts "wiebenik-v5.ts"
avconv -i "templates/v2/ikkanjehelpenmet-v2.mov" -f mpegts "ikkanjehelpenmet-v5.ts"
avconv -i "templates/v2/ikbenopzoeknaar-v2.mov" -f mpegts "ikbenopzoeknaar-v5.ts"

avconv -i concat:"wiebenik-v5.ts|tmp_ruud_0.ts|ikkanjehelpenmet-v5.ts|tmp_ruud_1.ts|ikbenopzoeknaar-v5.ts|tmp_ruud_2.ts" -strict experimental "test.mp4"

编辑 3;我目前正在转换每个文件并将它们的大小更改为相同的格式并对其进行规范化,如下所示:

avconv -i "public/videos/44_0.90768300-14822311688474.mp4" -filter:v "transpose=1, scale=iw*min(1920/iw\,1080/ih):ih*min(1920/iw\,1080/ih), pad=1920:1080:(1920-iw*min(1920/iw\,1080/ih))/2:(1080-ih*min(1920/iw\,1080/ih))/2" -c:a copy "public/videos/tmp_44_0.mp4"
avconv -i public/videos/tmp_44_0.mp4 -c:v copy -c:a libmp3lame -b:a 128k -ac 2 -ar 48000 public/videos/tmp_44_0_normalized.mp4
avconv -i "public/videos/44_0.09416600-14822311719723.mp4" -filter:v "transpose=1, scale=iw*min(1920/iw\,1080/ih):ih*min(1920/iw\,1080/ih), pad=1920:1080:(1920-iw*min(1920/iw\,1080/ih))/2:(1080-ih*min(1920/iw\,1080/ih))/2" -c:a copy "public/videos/tmp_44_1.mp4"
avconv -i public/videos/tmp_44_1.mp4 -c:v copy -c:a libmp3lame -b:a 128k -ac 2 -ar 48000 public/videos/tmp_44_1_normalized.mp4
avconv -i "public/videos/44_0.37376500-14822311735955.mp4" -filter:v "transpose=1, scale=iw*min(1920/iw\,1080/ih):ih*min(1920/iw\,1080/ih), pad=1920:1080:(1920-iw*min(1920/iw\,1080/ih))/2:(1080-ih*min(1920/iw\,1080/ih))/2" -c:a copy "public/videos/tmp_44_2.mp4"
avconv -i public/videos/tmp_44_2.mp4 -c:v copy -c:a libmp3lame -b:a 128k -ac 2 -ar 48000 public/videos/tmp_44_2_normalized.mp4

完成这些更改后,我将它们组合起来如下:

MP4Box public/videos/templates/v2/wiebenik-v2.mp4 -cat public/videos/tmp_44_0_normalized.mp4 -cat public/videos/templates/v2/ikkanjehelpenmet-v2.mp4 -cat public/videos/tmp_44_1_normalized.mp4 -cat public/videos/templates/v2/ikbenopzoeknaar-v2.mp4 -cat public/videos/tmp_44_2_normalized.mp4 -cat public/videos/templates/v2/2connect-v2.mp4 -out public/pitches/44_9b374c31dcaa7433daf0f5163a3789dc.mp4

但不知何故,即使只有 2 个文件,我还是收到了错误:

Cannot concatenate files: Different AVC Level Indication between source (42) and destination (40)

事实证明我的文件具有不同的高质量版本(4 和 4.2),目前还不知道如何解决这个问题。

答案1

看起来您所遇到的问题与错误的选择组合有关。

您已选择 MPEG 传输流作为容器: 传输流倾向于以恒定比特率 (CBR) 进行广播,以保持一致的广播速率,当数据不足时,用填充字节填充。似乎由于选择 x264 作为编解码器而变得复杂X264没有原生恒定比特率模式。对我来说,这似乎是违反直觉的。

如果我负责这个项目,我会想要确保很多事情。

1). 所有需要连接的夹子必须规范化(即相同的视频尺寸、相同的音频采样率、相同的音频视频比特率)

2)编解码器容器我选择的格式具有兼容的特性。

以特定比特率对无损样本进行所有编辑可能是明智的做法,以确保准确的时间安排。

当你开始音频这是有损压缩,您的音频时间将受到质疑。

进一步的研究表明,当容器不是 flv、m4a、mov 或 mp4 时,aac 复制问题与 -bsf:a aac_adtstoasc 有关。您可能希望阅读该帖子中的最后评论。

有关实际的示例选项,请参阅我的回答这里如果您确实需要,-f mpegts请在确认完整的 A/V 同步后最后执行该步骤。

相关内容