程序员求职经验分享与学习资料整理平台

网站首页 > 文章精选 正文

用ffmpeg生成短视频(ffmpeg剪辑)

balukai 2025-07-27 18:42:46 文章精选 3 ℃

用ffmpeg就可以将图片、文字、声音组合成短视频

环境

ubuntu 24.04

安装

sudo apt update
sudo apt install ffmpeg

ffmpeg -version

准备素材

准备背景图、字幕、TTS语音。如下

$ tree
.
├── fnjwyzy_fdbwymz
│   ├── fnjwyzy_fdbwymz.jpg
│   ├── fnjwyzy_fdbwymz.mp3
│   └── fnjwyzy_fdbwymz.srt
└── tomp4.sh
$ cat fnjwyzy_fdbwymz/fnjwyzy_fdbwymz.srt 
1
00:00:00,000 --> 00:00:02,000
非宁静无以致远

2
00:00:02,000 --> 00:00:04,000
非淡泊无以明志

生成视频

使用脚本tomp4.sh就可以生成视频。脚本内容如下:

$ cat tomp4.sh 
#!/usr/bin/bash

name=$1

ffmpeg \
  -loop 1 -i ${name}/${name}.jpg \
  -i ${name}/${name}.mp3 \
  -vf "subtitles=${name}/${name}.srt:force_style='Fontsize=24,PrimaryColour=FFFFFF'" \
  -c:v libx264 \
  -tune stillimage \
  -c:a aac \
  -b:a 192k \
  -shortest \
  -pix_fmt yuv420p \
  ${name}/${name}.mp4


$ ./tomp4.sh fnjwyzy_fdbwymz
ffmpeg version 6.1.1-3ubuntu5 Copyright (c) 2000-2023 the FFmpeg developers
  built with gcc 13 (Ubuntu 13.2.0-23ubuntu3)
  configuration: --prefix=/usr --extra-version=3ubuntu5 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --arch=amd64 --enable-gpl --disable-stripping --disable-omx --enable-gnutls --enable-libaom --enable-libass --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libcodec2 --enable-libdav1d --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libglslang --enable-libgme --enable-libgsm --enable-libharfbuzz --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzimg --enable-openal --enable-opencl --enable-opengl --disable-sndio --enable-libvpl --disable-libmfx --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-ladspa --enable-libbluray --enable-libjack --enable-libpulse --enable-librabbitmq --enable-librist --enable-libsrt --enable-libssh --enable-libsvtav1 --enable-libx264 --enable-libzmq --enable-libzvbi --enable-lv2 --enable-sdl2 --enable-libplacebo --enable-librav1e --enable-pocketsphinx --enable-librsvg --enable-libjxl --enable-shared
  libavutil      58. 29.100 / 58. 29.100
  libavcodec     60. 31.102 / 60. 31.102
  libavformat    60. 16.100 / 60. 16.100
  libavdevice    60.  3.100 / 60.  3.100
  libavfilter     9. 12.100 /  9. 12.100
  libswscale      7.  5.100 /  7.  5.100
  libswresample   4. 12.100 /  4. 12.100
  libpostproc    57.  3.100 / 57.  3.100
Input #0, image2, from 'fnjwyzy_fdbwymz/fnjwyzy_fdbwymz.jpg':
  Duration: 00:00:00.04, start: 0.000000, bitrate: 26304 kb/s
  Stream #0:0: Video: mjpeg (Baseline), yuvj420p(pc, bt470bg/unknown/unknown), 936x1664 [SAR 1:1 DAR 9:16], 25 fps, 25 tbr, 25 tbn
[mp3 @ 0x605640f5cc00] Estimating duration from bitrate, this may be inaccurate
Input #1, mp3, from 'fnjwyzy_fdbwymz/fnjwyzy_fdbwymz.mp3':
  Duration: 00:00:03.70, start: 0.000000, bitrate: 48 kb/s
  Stream #1:0: Audio: mp3, 24000 Hz, mono, fltp, 48 kb/s
[Parsed_subtitles_0 @ 0x605640f55d40] libass API version: 0x1701000
[Parsed_subtitles_0 @ 0x605640f55d40] libass source: tarball: 0.17.1
[Parsed_subtitles_0 @ 0x605640f55d40] Shaper: FriBidi 1.0.13 (SIMPLE) HarfBuzz-ng 8.3.0 (COMPLEX)
[Parsed_subtitles_0 @ 0x605640f55d40] Using font provider fontconfig
Stream mapping:
  Stream #0:0 -> #0:0 (mjpeg (native) -> h264 (libx264))
  Stream #1:0 -> #0:1 (mp3 (mp3float) -> aac (native))
Press [q] to stop, [?] for help
[Parsed_subtitles_0 @ 0x605641054ac0] libass API version: 0x1701000
[Parsed_subtitles_0 @ 0x605641054ac0] libass source: tarball: 0.17.1
[Parsed_subtitles_0 @ 0x605641054ac0] Shaper: FriBidi 1.0.13 (SIMPLE) HarfBuzz-ng 8.3.0 (COMPLEX)
[Parsed_subtitles_0 @ 0x605641054ac0] Using font provider fontconfig
[swscaler @ 0x6056418d1c00] deprecated pixel format used, make sure you did set range correctly
[Parsed_subtitles_0 @ 0x605641054ac0] fontselect: (Arial, 400, 0) -> /usr/share/fonts/truetype/liberation/LiberationSans-Regular.ttf, 0, LiberationSans
[Parsed_subtitles_0 @ 0x605641054ac0] Glyph 0x975E not found, selecting one more font for (Arial, 400, 0)
[Parsed_subtitles_0 @ 0x605641054ac0] fontselect: (Arial, 400, 0) -> /usr/share/fonts/opentype/noto/NotoSansCJK-Regular.ttc, 2, NotoSansCJKsc-Regular
[swscaler @ 0x605641919380] deprecated pixel format used, make sure you did set range correctly
    Last message repeated 2 times
[libx264 @ 0x605640fffb00] using SAR=1/1
[libx264 @ 0x605640fffb00] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX FMA3 BMI2 AVX2 AVX512
[libx264 @ 0x605640fffb00] profile High, level 4.0, 4:2:0, 8-bit
[libx264 @ 0x605640fffb00] 264 - core 164 r3108 31e19f9 - H.264/MPEG-4 AVC codec - Copyleft 2003-2023 - http://www.videolan.org/x264.html - options: cabac=1 ref=3 deblock=1:-3:-3 analyse=0x3:0x113 me=hex subme=7 psy=1 psy_rd=2.00:0.70 mixed_ref=1 me_range=16 chroma_me=1 trellis=1 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=-4 threads=12 lookahead_threads=2 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=2 b_adapt=1 b_bias=0 direct=1 weightb=1 open_gop=0 weightp=2 keyint=250 keyint_min=25 scenecut=40 intra_refresh=0 rc_lookahead=40 rc=crf mbtree=1 crf=23.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.20
[aac @ 0x60564125f040] Too many bits 8192.000000 > 6144 per frame requested, clamping to max
Output #0, mp4, to 'fnjwyzy_fdbwymz/fnjwyzy_fdbwymz.mp4':
  Metadata:
    encoder         : Lavf60.16.100
  Stream #0:0: Video: h264 (avc1 / 0x31637661), yuv420p(tv, bt470bg/unknown/unknown, progressive), 936x1664 [SAR 1:1 DAR 9:16], q=2-31, 25 fps, 12800 tbn
    Metadata:
      encoder         : Lavc60.31.102 libx264
    Side data:
      cpb: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: N/A
  Stream #0:1: Audio: aac (LC) (mp4a / 0x6134706D), 24000 Hz, mono, fltp, 144 kb/s
    Metadata:
      encoder         : Lavc60.31.102 aac
[out#0/mp4 @ 0x605640f4f000] video:139kB audio:41kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 2.025884%
frame=   92 fps=0.0 q=-1.0 Lsize=     184kB time=00:00:03.66 bitrate= 410.1kbits/s speed=3.85x    
[libx264 @ 0x605640fffb00] frame I:1     Avg QP:14.59  size: 91065
[libx264 @ 0x605640fffb00] frame P:23    Avg QP:15.40  size:  1680
[libx264 @ 0x605640fffb00] frame B:68    Avg QP:10.64  size:   177
[libx264 @ 0x605640fffb00] consecutive B-frames:  1.1%  0.0%  3.3% 95.7%
[libx264 @ 0x605640fffb00] mb I  I16..4: 25.5% 63.1% 11.4%
[libx264 @ 0x605640fffb00] mb P  I16..4:  0.0%  0.1%  0.1%  P16..4:  2.4%  0.4%  0.5%  0.0%  0.0%    skip:96.5%
[libx264 @ 0x605640fffb00] mb B  I16..4:  0.0%  0.0%  0.0%  B16..8:  2.4%  0.0%  0.0%  direct: 0.0%  skip:97.6%  L0:59.4% L1:40.4% BI: 0.2%
[libx264 @ 0x605640fffb00] 8x8 transform intra:62.6% inter:85.0%
[libx264 @ 0x605640fffb00] coded y,uvDC,uvAC intra: 55.1% 66.2% 41.0% inter: 0.4% 0.2% 0.0%
[libx264 @ 0x605640fffb00] i16 v,h,dc,p: 67% 23%  8%  2%
[libx264 @ 0x605640fffb00] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 35% 26% 14%  4%  3%  3%  4%  4%  7%
[libx264 @ 0x605640fffb00] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 37% 21%  9%  5%  5%  5%  5%  6%  6%
[libx264 @ 0x605640fffb00] i8c dc,h,v,p: 48% 25% 23%  4%
[libx264 @ 0x605640fffb00] Weighted P-Frames: Y:0.0% UV:0.0%
[libx264 @ 0x605640fffb00] ref P L0: 90.9%  0.5%  8.3%  0.4%
[libx264 @ 0x605640fffb00] ref B L0: 33.5% 66.3%  0.2%
[libx264 @ 0x605640fffb00] ref B L1: 96.6%  3.4%
[libx264 @ 0x605640fffb00] kb/s:308.19
[aac @ 0x60564125f040] Qavg: 65411.148

Tags:

最近发表
标签列表