使用 FFmpeg 进行分割、修剪、转换为图像和连接问题

使用 FFmpeg 进行分割、修剪、转换为图像和连接问题

我是 FFmpeg 的新手。我阅读了一些基本基础知识,但无法弄清楚为什么以下命令不起作用。该脚本是在 Windows 中的 PowerShell 中编写的。

ffmpeg -hide_banner `
  -loop 1 -t 3 -i image.jpg `
  -i input.mp4 `
  -filter_complex "`
    [1:v] split=2 [v1][v2];
    [1:a] asplit=2 [a1][a2]; `
    [v1] trim=start=10:duration=10, setpts=PTS-STARTPTS [ov1];`
    [a1] atrim=start=10:duration=10, asetpts=PTS-STARTPTS [oa1];`
    [v2] trim=start=40:duration=10, setpts=PTS-STARTPTS [ov2];`
    [a2] atrim=start=40:duration=10, asetpts=PTS-STARTPTS [oa2];`
    [0][ov1][ov2] concat=n=3:v=1:a=0 [v]; `
    [oa1][oa2] concat=n=2:v=0:a=1 [ca]; `
    [ca] adelay=3s|3s|3s|3s|3s|3s, asetpts=PTS-STARTPTS [a]; `
  "`
  -map "[v]" -map "[a]" `
  -c:v libx264 -preset slow -crf 20 `
  -c:a aac -b:a 128k `
  output.mp4

它仅生成图像并且 FFMpeg 报告以下警告:

非单调 DTS;之前:1024,当前:0;更改为 1025。这可能会导致输出文件中的时间戳不正确。

我搞清楚了如何应用过滤器:splitconcat。我知道我需要标记过滤器每个部分的输入和输出。我理解-map需要指示输出文件中包含的流。

我不确定是否-loop 1 -t 3 -i ...正确,并且部分内容PTS是从某处复制而来——我对 PTS 有一点了解。最后,adelay图像之后会使音频流与视频流同步。

我在这里想要实现的目标是:

  • 将图像转换为视频
  • 将第二个输入克隆到两个单独的流中
  • 修剪这两个流,并且
  • 将所有内容连接成一个视频/音频。

图像应该需要 3 秒,其余流每个需要 10 秒,因此整个视频应该长 23 秒。但它没有做到这一点。


编辑。有关输入/输出文件和 FFMpeg 本身的更多信息。请注意,以上所有输出均由以下版本的 FFMpeg 创建:吉安。我目前正在研究 FFMpeg

该视频下载自下载示例视频样本视频本身是.mp410MB(直接链接)。图像只是随机裁剪为 1280x720 大小的 JPEG。

打印内容如下ffmpeg -version

ffmpeg version 2024-01-11-git-5e751dabc5-full_build-www.gyan.dev Copyright (c) 2000-2024 the FFmpeg developers
built with gcc 12.2.0 (Rev10, Built by MSYS2 project)
configuration: --enable-gpl --enable-version3 --enable-static --pkg-config=pkgconf --disable-w32threads --disable-autodetect --enable-fontconfig --enable-iconv --enable-gnutls --enable-libxml2 --enable-gmp --enable-bzlib --enable-lzma --enable-libsnappy --enable-zlib --enable-librist --enable-libsrt --enable-libssh --enable-libzmq --enable-avisynth --enable-libbluray --enable-libcaca --enable-sdl2 --enable-libaribb24 --enable-libaribcaption --enable-libdav1d --enable-libdavs2 --enable-libuavs3d --enable-libzvbi --enable-librav1e --enable-libsvtav1 --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxavs2 --enable-libxvid --enable-libaom --enable-libjxl --enable-libopenjpeg --enable-libvpx --enable-mediafoundation --enable-libass --enable-frei0r --enable-libfreetype --enable-libfribidi --enable-libharfbuzz --enable-liblensfun --enable-libvidstab --enable-libvmaf --enable-libzimg --enable-amf --enable-cuda-llvm --enable-cuvid --enable-ffnvcodec --enable-nvdec --enable-nvenc --enable-dxva2 --enable-d3d11va --enable-libvpl --enable-libshaderc --enable-vulkan --enable-libplacebo --enable-opencl --enable-libcdio --enable-libgme --enable-libmodplug --enable-libopenmpt --enable-libopencore-amrwb --enable-libmp3lame --enable-libshine --enable-libtheora --enable-libtwolame --enable-libvo-amrwbenc --enable-libcodec2 --enable-libilbc --enable-libgsm --enable-libopencore-amrnb --enable-libopus --enable-libspeex --enable-libvorbis --enable-ladspa --enable-libbs2b --enable-libflite --enable-libmysofa --enable-librubberband --enable-libsoxr --enable-chromaprint
libavutil      58. 36.101 / 58. 36.101
libavcodec     60. 37.100 / 60. 37.100
libavformat    60. 20.100 / 60. 20.100
libavdevice    60.  4.100 / 60.  4.100
libavfilter     9. 17.100 /  9. 17.100
libswscale      7.  6.100 /  7.  6.100
libswresample   4. 13.100 /  4. 13.100
libpostproc    57.  4.100 / 57.  4.100

输出ffprobe -hide_banner input.mp4

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '.\input.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    creation_time   : 1970-01-01T00:00:00.000000Z
    encoder         : Lavf53.24.2
  Duration: 00:01:02.31, start: 0.000000, bitrate: 1347 kb/s
  Stream #0:0[0x1](und): Video: h264 (Main) (avc1 / 0x31637661), yuv420p(progressive), 1280x720 [SAR 1:1 DAR 16:9], 959 kb/s, 25 fps, 25 tbr, 12800 tbn (default)
      Metadata:
        creation_time   : 1970-01-01T00:00:00.000000Z
        handler_name    : VideoHandler
        vendor_id       : [0][0][0][0]
  Stream #0:1[0x2](und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, 5.1, fltp, 383 kb/s (default)
      Metadata:
        creation_time   : 1970-01-01T00:00:00.000000Z
        handler_name    : SoundHandler
        vendor_id       : [0][0][0][0]

输出ffprobe -hide_banner output.mp4

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '.\output.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf60.20.100
  Duration: 00:00:05.28, start: 0.000000, bitrate: 921 kb/s
  Stream #0:0[0x1](und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(progressive), 1280x720 [SAR 1:1 DAR 16:9], 842 kb/s, 25 fps, 25 tbr, 12800 tbn (default)
      Metadata:
        handler_name    : VideoHandler
        vendor_id       : [0][0][0][0]
        encoder         : Lavc60.37.100 libx264
  Stream #0:1[0x2](und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, 5.1, fltp, 128 kb/s (default)
      Metadata:
        handler_name    : SoundHandler
        vendor_id       : [0][0][0][0]

mediainfo 的输出input.jpg

General
Complete name                            : C:\Users\zbkoz\Desktop\demo-video\image.jpg
Format                                   : JPEG
File size                                : 519 KiB

Image
Format                                   : JPEG
Width                                    : 1 280 pixels
Height                                   : 720 pixels
Color space                              : YUV
Chroma subsampling                       : 4:4:4
Bit depth                                : 8 bits
Compression mode                         : Lossy
Stream size                              : 519 KiB (100%)
ColorSpace_ICC                           : RGB

答案1

我有一个解决方案,但不完全确定这是否有资格作为答案。

本质上,该脚本似乎在构建时没有问题。我决定安装另一个版本下载 FFmpeg正如我在评论中所说,该问题无法重现。

我可以确认脚本在 FFMpeg 上仍然不起作用来自 gyan.dev 的 Windows 版本

相关内容