【问题标题】:ffmpeg: concat and encode with one commandffmpeg:使用一个命令连接和编码
【发布时间】:2018-08-23 13:23:57
【问题描述】:

我有一个script,它可以自动编码和连接一系列输入视频文件。 我正在尝试在单个命令中进行编码和连接。

目前它不起作用,导致最终视频输出出现巨大的空白停顿。

我想使用 concat demux 而不是 concat 协议来获得结果,因为在脚本中自动化要困难得多

您知道是否可以使用 concat demux 归档此结果? 非常感谢!

马西莫

编码/连接 1080p

for f in ./*.mp4; do echo "file '$f'" >> list.txt; done

ffmpeg -f concat -safe 0 -y -i list.txt -i ../logo/logo.png -c:a aac -b:a 384k -ar 48000 -ac 2 -af aresample=async=1000 -c:v libx264 -x264opts keyint=50:min-keyint=50:no-scenecut -bf 0 -r 25 -b:v 4800k -maxrate 4800k -bufsize 3000k -profile:v main -crf 22 -filter_complex "[0:v][1:v]overlay=main_w-overlay_w-10:10,scale=1920:1080,setsar=1" ../buffer/1080set.mp4

似乎在低帧率下增加了长时间的停顿:

[mov,mp4,m4a,3gp,3g2,mj2 @ 0x7fb03f05e600] 自动插入 h264_mp4toannexb 比特流过滤器

帧= 9745 fps= 13 q=27.0 大小= 186368kB 时间=00:18:52.56 比特率=1348.0kbits

帧= 9745 fps= 13 q=27.0 大小= 186368kB 时间=00:18:56.57 比特率=1343.3kbits/

帧= 9745 fps= 13 q=27.0 大小= 186368kB 时间=00:19:00.65 比特率=1338.5kbits/

帧= 9745 fps= 13 q=27.0 大小= 186368kB 时间=00:19:02.29 比特率=1336.5kbits/

超过 1000 帧重复

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '1.mp4':
  Metadata:
    major_brand     : mp42
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    creation_time   : 2016-02-27T22:25:49.000000Z
    encoder         : HandBrake 0.10.5 2016021100
  Duration: 00:06:29.87, start: 0.000000, bitrate: 3447 kb/s
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709), 768x432, 3282 kb/s, 25 fps, 25 tbr, 90k tbn, 180k tbc (default)
    Metadata:
      creation_time   : 2016-02-27T22:25:49.000000Z
      handler_name    : VideoHandler
    Stream #0:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 159 kb/s (default)
    Metadata:
      creation_time   : 2016-02-27T22:25:49.000000Z
      handler_name    : Stereo

Input #1, mov,mp4,m4a,3gp,3g2,mj2, from '2.mp4':
  Metadata:
    major_brand     : M4V 
    minor_version   : 1
    compatible_brands: M4V mp42isom
    creation_time   : 2016-02-27T18:52:37.000000Z
  Duration: 00:07:16.93, start: 0.000000, bitrate: 1184 kb/s
    Stream #1:0(eng): Video: h264 (Main) (avc1 / 0x31637661), yuv420p(tv, smpte170m), 768x432, 991 kb/s, 25 fps, 25 tbr, 25k tbn, 50 tbc (default)
    Metadata:
      creation_time   : 2016-02-27T18:52:37.000000Z
      handler_name    : Mainconcept MP4 Video Media Handler
      encoder         : AVC Coding
    Stream #1:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 189 kb/s (default)
    Metadata:
      creation_time   : 2016-02-27T18:52:37.000000Z
      handler_name    : Mainconcept MP4 Sound Media Handler

Input #2, mov,mp4,m4a,3gp,3g2,mj2, from '3.mp4':
  Metadata:
    major_brand     : mp42
    minor_version   : 0
    compatible_brands: mp42mp41
    creation_time   : 2017-06-27T17:58:17.000000Z
  Duration: 00:05:05.05, start: 0.000000, bitrate: 2622 kb/s
    Stream #2:0(eng): Video: h264 (Main) (avc1 / 0x31637661), yuv420p(tv, smpte170m), 768x432, 2301 kb/s, 25 fps, 25 tbr, 25k tbn, 50 tbc (default)
    Metadata:
      creation_time   : 2017-06-27T17:58:17.000000Z
      handler_name    : Alias Data Handler
      encoder         : AVC Coding
    Stream #2:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 317 kb/s (default)
    Metadata:
      creation_time   : 2017-06-27T17:58:17.000000Z
      handler_name    : Alias Data Handler

Input #3, mov,mp4,m4a,3gp,3g2,mj2, from '4.mp4':
  Metadata:
    major_brand     : mp42
    minor_version   : 0
    compatible_brands: mp42mp41
    creation_time   : 2017-06-27T17:53:32.000000Z
  Duration: 00:06:47.36, start: 0.000000, bitrate: 3144 kb/s
    Stream #3:0(eng): Video: h264 (Main) (avc1 / 0x31637661), yuv420p(tv, smpte170m), 768x432, 2819 kb/s, 25 fps, 25 tbr, 25k tbn, 50 tbc (default)
    Metadata:
      creation_time   : 2017-06-27T17:53:32.000000Z
      handler_name    : Alias Data Handler
      encoder         : AVC Coding
    Stream #3:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 317 kb/s (default)
    Metadata:
      creation_time   : 2017-06-27T17:53:32.000000Z
      handler_name    : Alias Data Handler

【问题讨论】:

  • 首先手动确保您的ffmpeg 命令可以在终端中无脚本地工作。然后,一旦你让它工作,你就可以将它实现到脚本中。现在我不知道问题是由于脚本还是由于您的 ffmpeg 命令或两者兼而有之。您可以让我们更轻松地提供帮助,但提供复制问题所需的任何输入,显示您正在执行的实际 ffmpeg 命令,以及这些命令的完整控制台输出。
  • 其次,ffmpeg 的控制台输出并不意味着在脚本中进行解析,而仅用于提供信息。这就是 ffprobe 的用途。 ffmpeg 输出未标准化,因此输出可能无法正确解析。此外,它输出的帧速率是速记值,因此不准确。 Use ffprobe instead。通过 shellcheck.net 运行您的脚本以获得一些 bash 建议。
  • 嗨@LordNeckbeard我会修改它,目前脚本只提取帧率并计算封闭帧率
  • 感谢建议,其实肯定不完美,我会用ffprobe更新,但我确定结果是一样的
  • 您能否显示要连接的每个单独输入的信息? ffmpeg -i input1 -i input2 -i input3

标签: bash ffmpeg


【解决方案1】:

连接解复用器

concat demuxer 需要所有输入具有相同的格式、流数、流类型、流顺序(或使用exact_stream_id)、时基、帧速率、音频采样率、音频通道布局,并且它是也建议宽度和高度相同。

在您的情况下,第一个输入的时基 (tbn) 与其他输入不同。您可以预处理此输入以使其与其他输入一致:

ffmpeg -i 1.mp4 -c copy -video_track_timescale 25k 1_reset.mp4

然后使用 concat demuxer 运行您的命令。

连续过滤器

因为无论如何您都在重新编码,所以使用 concat 过滤器可能更容易。这使您可以使用各种过滤器使每个输入保持一致,然后在一个命令中连接所有输入。本站有severalexamples这样使用。

【讨论】:

  • 非常感谢!很棒的一课,我正在考虑一个脚本,它可以找到错误的 tbn 文件并在编码之前对其进行更正,使用 -c copy 似乎是一个即时更正,我不确定我现在是否想离开早期的 concat demux,我必须做一些测试
  • 或者我可以在 concat/demux 命令之前将所有音轨更正为默认 tbn
  • @MassimoVantaggio 使用-c copy 进行流式复制会相对较快,因为它避免了重新编码。您可以使用ffprobe -loglevel error -show_entries stream=time_base -select_streams v:0 -of csv=p=0 input.mp4 使用ffprobe 检查时基,注意-video_track_timescale 仅适用于 MP4/M4V/M4A/MOV。
  • tbc 怎么样,如何符合?
猜你喜欢
  • 2018-10-23
  • 2017-07-04
  • 2019-03-21
  • 2017-10-01
  • 1970-01-01
  • 2014-10-26
  • 1970-01-01
  • 2018-03-08
  • 2016-01-05
相关资源
最近更新 更多