ffmpeg - 连接后过滤文本消失,为什么?

标签 ffmpeg ffmpeg-php

我正在尝试连接 2 个视频,同时在第二个视频中添加一些文本。我正在使用 php-ffmpeg 来执行此操作,并带有 Sharapov 扩展,但我有实际的 ffmpeg 命令。

为此,它似乎对第一个视频进行编码,然后将第二个视频与文本分别编码,然后将它们连接在一起。问题是文本出现在编码(但未连接)的第二个视频中,但一旦它们连接在一起,它就会消失。

以下是命令:

ffmpeg '-y' '-i' 'video_in/first_vid.mp4' '-threads' '8' '-vcodec' 'libx264' '-acodec' 'aac' '-max_muxing_queue_size' '400' '-b:v' '1000k' '-refs' '6' '-coder' '1' '-sc_threshold' '40' '-flags' '+loop' '-me_range' '16' '-subq' '7' '-i_qfactor' '0.71' '-qcomp' '0.6' '-qdiff' '4' '-trellis' '1' '-b:a' '256k' '-ac' '2' '-pass' '1' '-passlogfile' '/tmp/ffmpeg-passes5b73814fa1e29qjif7/pass-5b73814fa1f5b' '/data/tmp/ffmpeg-7a580007c010377da19305b0836e7a4d-5b73814f9ff35.mp4'

    2%    2%    2%    4%    4%    6%    6%    6%    8%    8%    10%    10%    10%    12%    12%    12%    14%    14%    14%    16%    16%    18%    18%    18%    20%    20%    22%    22%    22%    24%    24%    24%    26%    26%    26%    28%    28%    28%    30%    30%    30%    32%    32%    34%    34%    34%    36%    36%    36%    38%    38%    38%    40%    40%    40%    42%    44%    44%    44%    46%    46%    46%    48%    48%    48%

ffmpeg '-y' '-i' 'video_in/first_vid.mp4' '-threads' '8' '-vcodec' 'libx264' '-acodec' 'aac' '-max_muxing_queue_size' '400' '-b:v' '1000k' '-refs' '6' '-coder' '1' '-sc_threshold' '40' '-flags' '+loop' '-me_range' '16' '-subq' '7' '-i_qfactor' '0.71' '-qcomp' '0.6' '-qdiff' '4' '-trellis' '1' '-b:a' '256k' '-ac' '2' '-pass' '2' '-passlogfile' '/tmp/ffmpeg-passes5b73814fa1e29qjif7/pass-5b73814fa1f5b' '/data/tmp/ffmpeg-7a580007c010377da19305b0836e7a4d-5b73814f9ff35.mp4'

    50%    50%    50%    52%    52%    52%    52%    52%    52%    54%    54%    54%    54%    54%    54%    56%    56%    56%    56%    56%    56%    58%    58%    58%    58%    58%    58%    60%    60%    60%    60%    60%    60%    62%    62%    62%    62%    62%    62%    64%    64%    64%    64%    64%    66%    66%    66%    66%    66%    66%    66%    68%    68%    68%    68%    68%    70%    70%    70%    70%    70%    72%    72%    72%    72%    72%    72%    72%    74%    74%    74%    74%    74%    74%    74%    76%    76%    76%    76%    76%    76%    76%    78%    78%    78%    78%    78%    78%    80%    80%    80%    80%    80%    80%    82%    82%    82%    82%    82%    84%    84%    84%    84%    84%    84%    84%    84%    84%    84%    86%    86%    86%    86%    86%    86%    88%    88%    88%    88%    88%    88%    88%    90%    90%    90%    90%    90%    90%    90%    90%    92%    92%    92%    92%    94%    94%    94%    94%    94%    94%    94%    94%    94%    96%    96%    96%    96%    96%    96%    96%    96%    98%    98%    98%    98%    98%    98%

ffmpeg '-y' '-i' 'video/second_vid.mp4' '-filter_complex' '[0:v]drawtext=fontfile=/usr/share/fonts/truetype/msttcorefonts/arial.ttf:text='test text':fontcolor='ffffff@1':fontsize=30:x=(w-tw)/2:y=50:alpha='if(lt(t,2),0,if(lt(t,4),(t-2)/2,if(lt(t,24),1,if(lt(t,26),(2-(t-24))/2,0))))'' '-threads' '8' '-vcodec' 'libx264' '-acodec' 'aac' '-max_muxing_queue_size' '400' '-b:v' '1000k' '-refs' '6' '-coder' '1' '-sc_threshold' '40' '-flags' '+loop' '-me_range' '16' '-subq' '7' '-i_qfactor' '0.71' '-qcomp' '0.6' '-qdiff' '4' '-trellis' '1' '-b:a' '256k' '-ac' '2' '-pass' '1' '-passlogfile' '/tmp/ffmpeg-passes5b738244e22e0b38pp/pass-5b738244e2412' '/data/tmp/ffmpeg-ed6a389106090a6a9f9c71c7c357400b-5b738244e2215.mp4'

    2%    2%    4%    6%    8%    10%    12%    14%    14%    16%    18%    18%    20%    22%    22%    24%    26%    28%    30%    30%    32%    34%    34%    36%    38%    40%    42%    44%    44%    46%    48%

ffmpeg '-y' '-i' 'video/second_vid.mp4' '-filter_complex' '[0:v]drawtext=fontfile=/usr/share/fonts/truetype/msttcorefonts/arial.ttf:text='test text':fontcolor='ffffff@1':fontsize=30:x=(w-tw)/2:y=50:alpha='if(lt(t,2),0,if(lt(t,4),(t-2)/2,if(lt(t,24),1,if(lt(t,26),(2-(t-24))/2,0))))'' '-threads' '8' '-vcodec' 'libx264' '-acodec' 'aac' '-max_muxing_queue_size' '400' '-b:v' '1000k' '-refs' '6' '-coder' '1' '-sc_threshold' '40' '-flags' '+loop' '-me_range' '16' '-subq' '7' '-i_qfactor' '0.71' '-qcomp' '0.6' '-qdiff' '4' '-trellis' '1' '-b:a' '256k' '-ac' '2' '-pass' '2' '-passlogfile' '/tmp/ffmpeg-passes5b738244e22e0b38pp/pass-5b738244e2412' '/data/tmp/ffmpeg-ed6a389106090a6a9f9c71c7c357400b-5b738244e2215.mp4'

    52%    52%    54%    54%    56%    56%    58%    58%    60%    60%    62%    64%    66%    68%    70%    70%    72%    74%    76%    76%    78%    80%    82%    84%    86%    86%    88%    88%    90%    90%    92%    94%    96%    98%

ffmpeg '-y' '-f' 'concat' '-safe' '0' '-i' '/data/tmp/ffmpeg-concat-5b73814f9fe10' '-c' 'copy' 'video_out/done_vid.mp4'

(由于某种原因,它似乎以 50% 再次运行每个视频命令的编码)

因此,当我播放 ffmpeg-ed6a389106090a6a9f9c71c7c357400b-5b738244e2215.mp4 时,文本在那里,但是当我播放输出文件(done_vid.mp4)时,文本不在那里。

这是怎么回事?

更新:以下是 2 个临时文件的 ffprobes,以防万一:
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'data/tmp/ffmpeg-7a580007c010377da19305b0836e7a4d-5b73814f9ff35.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf57.83.100
  Duration: 00:02:25.17, start: 0.000000, bitrate: 1247 kb/s
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], 999 kb/s, 23.98 fps, 23.98 tbr, 24k tbn, 47.95 tbc (default)
    Metadata:
      handler_name    : VideoHandler
    Stream #0:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 242 kb/s (default)
    Metadata:
      handler_name    : SoundHandler


Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'data/tmp/ffmpeg-ed6a389106090a6a9f9c71c7c357400b-5b738244e2215.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf57.83.100
  Duration: 00:01:30.03, start: 0.000000, bitrate: 322 kb/s
    Stream #0:0(und): Video: h264 (High 4:4:4 Predictive) (avc1 / 0x31637661), yuv444p, 1280x720 [SAR 1:1 DAR 16:9], 61 kb/s, 23.98 fps, 23.98 tbr, 19184 tbn, 47.96 tbc (default)
    Metadata:
      handler_name    : VideoHandler
    Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 258 kb/s (default)
    Metadata:
      handler_name    : SoundHandler

最佳答案

问题

您的第一个视频输出是 yuv420p,但您的第二个视频输出是 yuv444p。两者都应该是yuv420p,所以加format=yuv420p到您的过滤器链的末尾:

'-filter_complex' '[0:v]drawtext=fontfile=/usr/share/fonts/truetype/msttcorefonts/arial.ttf:text='test text':fontcolor='ffffff@1':fontsize=30:x=(w-tw)/2:y=50:alpha='if(lt(t,2),0,if(lt(t,4),(t-2)/2,if(lt(t,24),1,if(lt(t,26),(2-(t-24))/2,0))))',format=yuv420p'

其他的东西
  • 由于您无论如何都要重新编码所有内容,请使用 concat filter ,然后您可以在一个命令中完成所有操作。
  • 你真的要执行两次传球吗?与 -crf 一起使用一次通行证而不是 -b:v除非您的目标是特定的输出文件大小。见 FFmpeg Wiki: H.264 .
  • 您无需声明-threads .编码器会自动选择一个合适的值。
  • 使用编码预设(参见上面的 wiki 链接)。然后你可以像 2006 一样停止编码,你可以删除所有这些:'-refs' '6' '-coder' '1' '-sc_threshold' '40' '-flags' '+loop' '-me_range' '16' '-subq' '7' '-i_qfactor' '0.71' '-qcomp' '0.6' '-qdiff' '4' '-trellis' '1' .
  • 我假设您正在制作要通过渐进式下载播放的视频。如果是这种情况,请添加 -movflags +faststart输出选项,以便它可以在查看器完全下载之前开始播放。
  • 关于ffmpeg - 连接后过滤文本消失,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51852211/

    相关文章:

    php - 我的基于 VPS Linux 的 Godaddy 服务器上的 ffmpeg 视频转换库不工作

    macos - 在 OS X El Capitan 10.11.1 上配置 ffmpeg 时出错

    html - 实时流式传输 RTMP 到 HTML5

    audio - 是否可以在不重新编码的情况下将立体声合并/缩混为单声道(m4a 或 opus)

    codeigniter - 从上传的视频中获取图像 codeigniter

    ffmpeg - 在 PHP 中使用 ffmpeg 压缩视频

    ffmpeg 图像列表(文本文件)到带有叠加水印的视频

    ffmpeg - 使用 ffmpeg 同时重新缩放和放慢电影

    php - 使用 FFmpeg 的语法不正确

    php - 加载 ffmpeg-php 模块失败