concat(ffmpeg)上的非单调DTS


17

运行此命令后ffmpeg -f concat -i mylist.txt -c copy output.mp4-我得到损坏的output.mp4文件和此消息:

ffmpeg -f concat -i mylist.txt -c copy output.mp4
ffmpeg version 2.6.2 Copyright (c) 2000-2015 the FFmpeg developers
  built with Apple LLVM version 6.1.0 (clang-602.0.49) (based on LLVM 3.6.0svn)
  configuration: --prefix=/usr/local/Cellar/ffmpeg/2.6.2 --enable-shared --enable-pthreads --enable-gpl --enable-version3 --enable-hardcoded-tables --enable-avresample --cc=clang --host-cflags= --host-ldflags= --enable-libx264 --enable-libmp3lame --enable-libvo-aacenc --enable-libxvid --enable-vda
  libavutil      54. 20.100 / 54. 20.100
  libavcodec     56. 26.100 / 56. 26.100
  libavformat    56. 25.101 / 56. 25.101
  libavdevice    56.  4.100 / 56.  4.100
  libavfilter     5. 11.102 /  5. 11.102
  libavresample   2.  1.  0 /  2.  1.  0
  libswscale      3.  1.101 /  3.  1.101
  libswresample   1.  1.100 /  1.  1.100
  libpostproc    53.  3.100 / 53.  3.100
Input #0, concat, from 'mylist.txt':
  Duration: N/A, start: 0.000000, bitrate: 829 kb/s
    Stream #0:0: Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1440x900, 701 kb/s, 30 fps, 30 tbr, 15360 tbn, 60 tbc
    Stream #0:1: Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 128 kb/s
Output #0, mp4, to 'output.mp4':
  Metadata:
    encoder         : Lavf56.25.101
    Stream #0:0: Video: h264 ([33][0][0][0] / 0x0021), yuv420p, 1440x900, q=2-31, 701 kb/s, 30 fps, 30 tbr, 15360 tbn, 15360 tbc
    Stream #0:1: Audio: aac ([64][0][0][0] / 0x0040), 44100 Hz, stereo, 128 kb/s
Stream mapping:
  Stream #0:0 -> #0:0 (copy)
  Stream #0:1 -> #0:1 (copy)
Press [q] to stop, [?] for help
[mp4 @ 0x7f897a01bc00] Non-monotonous DTS in output stream 0:0; previous: 598061, current: 467644; changing to 598062. This may result in incorrect timestamps in the output file.
[mp4 @ 0x7f897a01bc00] Non-monotonous DTS in output stream 0:0; previous: 598062, current: 468044; changing to 598063. This may result in incorrect timestamps in the output file.
[mp4 @ 0x7f897a01bc00] Non-monotonous DTS in output stream 0:0; previous: 598063, current: 468444; changing to 598064. This may result in incorrect timestamps in the output file.
...
[mp4 @ 0x7f897a01bc00] Non-monotonous DTS in output stream 0:0; previous: 598362, current: 588044; changing to 598363. This may result in incorrect timestamps in the output file.
frame= 1472 fps=0.0 q=-1.0 Lsize=    5825kB time=00:00:49.04 bitrate= 973.0kbits/s
video:4903kB audio:877kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.776358%

内容 mylist.txt

file 'cut.mp4'
file 'cut2.mp4'

ffmpeg的cut.mp4输出:

ffmpeg -i cut.mp4
ffmpeg version 2.6.2 Copyright (c) 2000-2015 the FFmpeg developers
  built with Apple LLVM version 6.1.0 (clang-602.0.49) (based on LLVM 3.6.0svn)
  configuration: --prefix=/usr/local/Cellar/ffmpeg/2.6.2 --enable-shared --enable-pthreads --enable-gpl --enable-version3 --enable-hardcoded-tables --enable-avresample --cc=clang --host-cflags= --host-ldflags= --enable-libx264 --enable-libmp3lame --enable-libvo-aacenc --enable-libxvid --enable-vda
  libavutil      54. 20.100 / 54. 20.100
  libavcodec     56. 26.100 / 56. 26.100
  libavformat    56. 25.101 / 56. 25.101
  libavdevice    56.  4.100 / 56.  4.100
  libavfilter     5. 11.102 /  5. 11.102
  libavresample   2.  1.  0 /  2.  1.  0
  libswscale      3.  1.101 /  3.  1.101
  libswresample   1.  1.100 /  1.  1.100
  libpostproc    53.  3.100 / 53.  3.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'cut.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf56.25.101
  Duration: 00:00:39.04, start: 0.036281, bitrate: 837 kb/s
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1440x900, 701 kb/s, 30 fps, 30 tbr, 15360 tbn, 60 tbc (default)
    Metadata:
      handler_name    : VideoHandler
    Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 128 kb/s (default)
    Metadata:
      handler_name    : SoundHandler

ffmpeg的cut2.mp4输出:

ffmpeg -i cut2.mp4
ffmpeg version 2.6.2 Copyright (c) 2000-2015 the FFmpeg developers
  built with Apple LLVM version 6.1.0 (clang-602.0.49) (based on LLVM 3.6.0svn)
  configuration: --prefix=/usr/local/Cellar/ffmpeg/2.6.2 --enable-shared --enable-pthreads --enable-gpl --enable-version3 --enable-hardcoded-tables --enable-avresample --cc=clang --host-cflags= --host-ldflags= --enable-libx264 --enable-libmp3lame --enable-libvo-aacenc --enable-libxvid --enable-vda
  libavutil      54. 20.100 / 54. 20.100
  libavcodec     56. 26.100 / 56. 26.100
  libavformat    56. 25.101 / 56. 25.101
  libavdevice    56.  4.100 / 56.  4.100
  libavfilter     5. 11.102 /  5. 11.102
  libavresample   2.  1.  0 /  2.  1.  0
  libswscale      3.  1.101 /  3.  1.101
  libswresample   1.  1.100 /  1.  1.100
  libpostproc    53.  3.100 / 53.  3.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'cut2.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf56.25.101
  Duration: 00:00:10.07, start: 0.000000, bitrate: 1498 kb/s
    Stream #0:0(und): Video: h264 (Main) (avc1 / 0x31637661), yuv420p, 1440x900, 1271 kb/s, 30 fps, 30 tbr, 12k tbn, 60 tbc (default)
    Metadata:
      handler_name    : VideoHandler
    Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 218 kb/s (default)
    Metadata:
      handler_name    : SoundHandler

cut.mp4 我通过这个命令 ffmpeg -ss 00:00:11 -i myfile.mp4 -to 00:00:39 -vf 'drawbox= : x=0 : y=0 : color=invert' cut.mp4

cut2.mp4 我通过这个命令 ffmpeg -ss 00:00:00 -i myfile.mp4 -to 00:00:10 -c copy cut2.mp4

我进行了很多搜索-找不到任何解决方案,也许有人可以帮我解决这个问题。

output.mp4 可以玩,但是看起来很奇怪。

在此处输入图片说明


1
可以同时提供两个输入文件,以便我执行测试吗?
llogan 2015年

@LordNeckbeard是的,我已将其发送给您,非常感谢。
whitesiroi,2015年

1
我似乎无法重复确切的问题。我正在使用tessus的最新静态构建。这些示例文件似乎与您的屏幕截图不同,但是在VLC和QuickTime中似乎可以正常工作,除了查找似乎混乱了。我在OS X机器上进行了测试,因为它看起来像您所使用的。
llogan'5

@LordNeckbeard非常感谢,是的,使用此版本ffmpeg N-71996-g372aa07-tessus,它确实很棒。谢谢。
whitesiroi 2015年

tl; dr; 删除-c copy以允许重新编码或-c:a copy仅使用。-c copy由于所有视频都已重新编码,因此concat步骤仍然可以使用。请注意,某些带有此警告的视频在concat之后仍然可以正常显示,因此-c copy很好。
林果皞

Answers:


10

使用最新的 ffmpeg

一般用户应始终ffmpeg从当前git master分支(可用的最新代码)中使用:

  • 遇到问题时,首先要做的就是检查您是否正在使用git master的构建。
  • 它被认为是稳定的。
  • 它将具有更多的错误修复和功能。
  • FFmpeg的开发非常活跃
  • 如果要从官方帮助资源获得支持,则必须使用git master。
  • 版本适用于发行商。

有关各种选项,请参见FFmpeg下载页面,或参阅FFmpeg Wiki:编译指南

其他的东西

  • 在命令中,drawbox您可以使用蒸汽复制音频,-c:a copy而无需重新编码。

  • 使用时-ss-to仅用作-ss输出选项时,才可按预期工作。


非常感谢您,它的运行效果更好,更快。你能也请检查一下吗video.stackexchange.com/questions/15477/… 我很好奇它是否可以简化。
whitesiroi,2015年

@whitesiroi好的。回答了,尽管看上去我使对该问题的评论者感到不高兴。
llogan'5


1

根据https://trac.ffmpeg.org/wiki/Concatenate

我有同样的问题。我在Mac上运行ffmpeg版本2.6.3。在ffmpeg中运行concat命令时,我将源剪辑转换为带有-q 0标记的.MTS格式,更新了文本文件中的扩展名,并将输出文件设置为.MTS。它像魅力一样运作。这是我的工作流程。

ffmpeg -i clip-1.MOV -q 0 clip-1.MTS

ffmpeg -i clip-2.MOV -q 0 clip-2.MTS

将文本文件(mylist.txt)更新为:

file clip-1.MTS
file clip-2.MTS

然后运行concat命令,如下所示:

ffmpeg -f concat -i mylist.txt -c copy output.MTS

为我工作!您可以将最终输出MTS转换为所需的任何格式。


该协议无损吗?
becko

不,第一个命令将转换为不具有无损模式的MPEG-2。
Gyan

1

我遇到类似的错误,并且输出视频中的音频有时不同步,有时完全丢失,但最终还是使用mkvmerge了mkvtoolnix。

我输入的视频使用不同的设置进行编码,并且具有不同的尺寸,因此我首先使用以下方法调整大小并重新编码ffmpeg

for f in *.mp4;do w=1280;h=720;ffmpeg -i $f -filter:v "scale=iw*min($w/iw\,$h/ih):ih*min($w/iw\,$h/ih),pad=$w:$h:($w-iw*min($w/iw\,$h/ih))/2:($h-ih*min($w/iw\,$h/ih))/2" -c:v libx264 -crf 22 -preset slow -pix_fmt yuv420p -c:a libfdk_aac -vbr 3 -ac 2 -ar 44100 ${f%mp4}mkv;done

我的一些输入视频没有音频通道,因此我使用了如下命令向它们添加无声音频通道:

for f in *.mkv;do ffprobe $f|&grep -q '1: Audio'||ffmpeg -i $f -f lavfi -i anullsrc -c:a libfdk_aac -shortest -c:v copy temp-$f;mv {temp-,}$f;done

之后,我将视频串联起来:

mkvmerge -o /tmp/output.mkv $(printf %s\\n *.mkv|sed '1!s/^/+/')

如果您的输入文件具有相同的尺寸,相同的音频通道数量,相同的音频采样率等,则可以使用它mkvmerge无损地连接文件。的输入文件mkvmerge也可以具有MP4容器,但是输出文件也将具有MKV容器,即使其文件扩展名指定为.mp4。您可以运行ffmpeg -i output.mkv -c copy output.mp4以更改容器。

mkvmerge具有类似的语法mkvmerge -o output.mkv file1.mkv + file2.mkv + file3.mkv,在这里mkvmerge -o output.mkv file1.mkv +file2.mkv +file3.mkv也可以接受。


1

基于邓肯的非常有帮助的答案:

for f in ./*.mp4; do ffmpeg -i $f -q 0 "${f%.*}.mts"; done

然后这样:

ffmpeg -f concat -safe 0 -i <(for f in ./*.mts; do echo "file '$PWD/$f'"; done) -c copy All.mts

0

当我使用ffmpeg重新混合一些录制的视频(可以是TS,MP4或MKV)并在输出流中出现非单调的dts-时间戳等错误时,生成的视频似乎仅具有音频或抖动地播放。我发现可靠地处理此问题的唯一方法是使用AviDemux。通过“音频和视频”的“复制”设置并选择“ MP4V2 Muxer”,可以在“配置”选项下选择“优化流传输”。生成的MP4文件现在可以在ffmpeg中使用,而不会产生错误消息。相信这是有用的。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.