FFMPEG - 连接不同来源的 mp4 - 无法停止 "Non-monotonous DTS in output stream"警告

标签 ffmpeg mp4

我需要连接来自不同来源的 mp4 文件,这意味着某些变量超出我的控制范围,例如时基、宽高比和编码。因此,为了解决这个问题,我重新编码并尝试在连接文件之前对其进行标准化。不幸的是,尽管如此,我在连接阶段收到输出流中的非单调 DTS 警告,并且输出视频似乎总是在最后一段时出现音频/视频同步中断。

我知道还有很多关于解决上述警告的其他问题,但我已经完成了所有这些问题并查看了文档..但不幸的是我仍然无法解决它..

我认为我不明白的是:如果我有来自不同来源的 mp4,我到底需要做什么才能确保这些文件始终整齐地连接在一起?

到目前为止我已经尝试过

我用来在连接之前标准化 mp4 文件的脚本如下(修改分辨率、帧速率、时基、音频比特率、视频比特率、音频编码和视频编码):

ffmpeg -y -i $1 -vf 'scale=1280:720:force_original_aspect_ratio=1,pad=1280:720:(ow-iw)/2:(oh-ih)/2' -r 30 -video_track_timescale 90000 -b:a 128K -b:v 1200K -c:a aac -c:v libx264 $2

这是两个文件的 ffprobe 输出,存在一些差异,但我不确定它们是否重要?

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'intro.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf58.12.100
  Duration: 00:00:08.98, start: 0.000000, bitrate: 1210 kb/s
    Stream #0:0(eng): Video: h264 (avc1 / 0x31637661), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], 1069 kb/s, 30 fps, 30 tbr, 90k tbn, 60 tbc (default)
    Metadata:
      handler_name    : VideoHandler
    Stream #0:1(eng): Audio: aac (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 132 kb/s (default)
    Metadata:
      handler_name    : SoundHandler

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'middle.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf58.12.100
  Duration: 00:00:59.72, start: 0.000000, bitrate: 1200 kb/s
    Stream #0:0(und): Video: h264 (avc1 / 0x31637661), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], 1063 kb/s, 30 fps, 30 tbr, 90k tbn, 60 tbc (default)
    Metadata:
      handler_name    : VideoHandler
    Stream #0:1(und): Audio: aac (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 128 kb/s (default)
    Metadata:
      handler_name    : SoundHandler

此时它们都有正常的视频和音频。

之后,我将它们连接起来并使用以下命令添加水印(很糟糕的是我需要在这里重新编码):

  ffmpeg -y \
    -f concat \
    -safe 0 \
    -i $INFILES \
    -c:v libx264 \
    -c:a copy \
    -preset fast \
    -vf drawtext=enable="'between(t, $DRAW_TEXT_DELAY, $DRAW_TEXT_DURATION)': fontfile=$FONT_DIR/$FONT: text='$TEXT': fontcolor=$FONTCOLOR: fontsize=$FONTSIZE: $POSITION" \
    $OUTFILE

INFILES 是文本文件的路径,格式如下:

file /usr/src/app/data/test/out/intro.mp4
file /usr/src/app/data/test/out/middle.mp4
file /usr/src/app/data/test/out/outro.mp4

我在这里缺少什么?有没有办法进一步调试?

最佳答案

您的音频流具有不同的采样率,并且也可能具有不同的 channel 数。此外,压缩的 MPEG 音频流在连接时会引入轻微的异步。

使用

ffmpeg -y -i $1 -vf 'scale=1280:720:force_original_aspect_ratio=1,pad=1280:720:(ow-iw)/2:(oh-ih)/2,setsar=1,format=yuv420p' -r 30 -c:v libx264 -b:v 1200K -ac 2 -ar 48000 -c:a pcm_s16le -video_track_timescale 90000 $2

标准化,但保存为 MOV。

然后在 concat 过程中,将 -c:a copy 更改为 -c:a aac

关于FFMPEG - 连接不同来源的 mp4 - 无法停止 "Non-monotonous DTS in output stream"警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51723633/

相关文章:

c++ - FFmpeg + OpenAL - 无法播放视频中的流式声音

ffmpeg - 将连续 RTSP 流保存为 5-10 分钟长的 mp4 文件

java - 如何在 Java Swing 应用程序中播放 MP4 视频

compilation - 在 CentOS 7 上编译 Shotdetect

audio - 合并视频和音频流,音频漂移

html - camtasia 视频不能在 ipad 上播放

PHP Regex - 视频文件直接链接和 YouTube 链接

actionscript-3 - 我可以使用 ffmpeg 和 actionscript 将网络摄像头视频 flv 转换为 mp4 吗?

ffmpeg - 如何使用 FFMPEG 管理音量

python - 写入同一视频后,视频的 NumPy 数组从原始数组发生变化