准备
确保电脑已经装了 ffmpeg 环境
ffmpeg -version

image.png
操作
使用 concat demuxer(推荐,简单)
- 创建文件列表:新建一个文本文件(如 list.txt),列出需要拼接的视频文件,格式如下:
file 'video1.mp4'
file 'video2.mp4'
确保文件路径正确(相对或绝对路径)。

image.png
运行 ffmpeg 命令:
ffmpeg -f concat -i list.txt -c copy output.mp4
-f concat:指定使用 concat demuxer。
-i list.txt:输入文件列表。
-c copy:直接复制视频和音频流,不重新编码,速度快,质量无损。

image.png
问题
- 查看原两个视频信息
C:\Users\Rina\Desktop\视频>ffmpeg -f concat -i list.txt -c copy output.mp4
ffmpeg version N-119024-g226fcc7258-20250328 Copyright (c) 2000-2025 the FFmpeg developers
built with gcc 14.2.0 (crosstool-NG 1.27.0.18_7458341)
configuration: --prefix=/ffbuild/prefix --pkg-config-flags=--static --pkg-config=pkg-config --cross-prefix=x86_64-w64-mingw32- --arch=x86_64 --target-os=mingw32 --enable-gpl --enable-version3 --disable-debug --enable-shared --disable-static --disable-w32threads --enable-pthreads --enable-iconv --enable-zlib --enable-libfreetype --enable-libfribidi --enable-gmp --enable-libxml2 --enable-lzma --enable-fontconfig --enable-libharfbuzz --enable-libvorbis --enable-opencl --disable-libpulse --enable-libvmaf --disable-libxcb --disable-xlib --enable-amf --enable-libaom --enable-libaribb24 --enable-avisynth --enable-chromaprint --enable-libdav1d --enable-libdavs2 --enable-libdvdread --enable-libdvdnav --disable-libfdk-aac --enable-ffnvcodec --enable-cuda-llvm --enable-frei0r --enable-libgme --enable-libkvazaar --enable-libaribcaption --enable-libass --enable-libbluray --enable-libjxl --enable-libmp3lame --enable-libopus --enable-librist --enable-libssh --enable-libtheora --enable-libvpx --enable-libwebp --enable-libzmq --enable-lv2 --enable-libvpl --enable-openal --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenh264 --enable-libopenjpeg --enable-libopenmpt --enable-librav1e --enable-librubberband --enable-schannel --enable-sdl2 --enable-libsnappy --enable-libsoxr --enable-libsrt --enable-libsvtav1 --enable-libtwolame --enable-libuavs3d --disable-libdrm --enable-vaapi --enable-libvidstab --enable-vulkan --enable-libshaderc --enable-libplacebo --disable-libvvenc --enable-libx264 --enable-libx265 --enable-libxavs2 --enable-libxvid --enable-libzimg --enable-libzvbi --extra-cflags=-DLIBTWOLAME_STATIC --extra-cxxflags= --extra-libs=-lgomp --extra-ldflags=-pthread --extra-ldexeflags= --cc=x86_64-w64-mingw32-gcc --cxx=x86_64-w64-mingw32-g++ --ar=x86_64-w64-mingw32-gcc-ar --ranlib=x86_64-w64-mingw32-gcc-ranlib --nm=x86_64-w64-mingw32-gcc-nm --extra-version=20250328
libavutil 59. 60.100 / 59. 60.100
libavcodec 61. 33.102 / 61. 33.102
libavformat 61. 9.108 / 61. 9.108
libavdevice 61. 4.100 / 61. 4.100
libavfilter 10. 9.100 / 10. 9.100
libswscale 8. 13.103 / 8. 13.103
libswresample 5. 4.100 / 5. 4.100
libpostproc 58. 4.100 / 58. 4.100
[mov,mp4,m4a,3gp,3g2,mj2 @ 0000024e731bbf00] Auto-inserting h264_mp4toannexb bitstream filter
Input #0, concat, from 'list.txt':
Duration: N/A, start: 0.000000, bitrate: 15204 kb/s
Stream #0:0(eng): Video: h264 (Main) (avc1 / 0x31637661), yuv420p(tv, bt709, progressive), 1920x1080, 14887 kb/s, 29.97 fps, 29.97 tbr, 30k tbn
Metadata:
creation_time : 2024-03-15T05:34:11.000000Z
handler_name : ?Mainconcept Video Media Handler
vendor_id : [0][0][0][0]
encoder : AVC Coding
Stream #0:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 317 kb/s
Metadata:
creation_time : 2024-03-15T05:34:12.000000Z
handler_name : #Mainconcept MP4 Sound Media Handler
vendor_id : [0][0][0][0]
Stream mapping:
Stream #0:0 -> #0:0 (copy)
Stream #0:1 -> #0:1 (copy)
Output #0, mp4, to 'output.mp4':
Metadata:
encoder : Lavf61.9.108
Stream #0:0(eng): Video: h264 (Main) (avc1 / 0x31637661), yuv420p(tv, bt709, progressive), 1920x1080, q=2-31, 14887 kb/s, 29.97 fps, 29.97 tbr, 30k tbn
Metadata:
creation_time : 2024-03-15T05:34:11.000000Z
handler_name : ?Mainconcept Video Media Handler
vendor_id : [0][0][0][0]
encoder : AVC Coding
Stream #0:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 317 kb/s
Metadata:
creation_time : 2024-03-15T05:34:12.000000Z
handler_name : #Mainconcept MP4 Sound Media Handler
vendor_id : [0][0][0][0]
Press [q] to stop, [?] for help
[mov,mp4,m4a,3gp,3g2,mj2 @ 0000024e75304700] Auto-inserting h264_mp4toannexb bitstream filter1x
[aost#0:1/copy @ 0000024e731c3c40] Non-monotonic DTS; previous: 17701888, current: 17701461; changing to 17701889. This may result in incorrect timestamps in the output file.
[out#0/mp4 @ 0000024e7314db80] video:945393KiB audio:17995KiB subtitle:0KiB other streams:0KiB global headers:0KiB muxing overhead: 0.067771%
frame=18030 fps=8016 q=-1.0 Lsize= 964041KiB time=00:10:01.37 bitrate=13132.3kbits/s speed= 267x
- 这个拼接出来有问题,第二个视频有问题,为避免帧率和时间戳问题,重新编码 video1.mp4 和 video2.mp4,确保视频和音频属性完全一致:
ffmpeg -i video1.mp4 -c:v libx264 -r 29.97 -c:a aac -ar 48000 -ac 2 -fflags +genpts standardized_video1.mp4
ffmpeg -i video2.mp4 -c:v libx264 -r 29.97 -c:a aac -ar 48000 -ac 2 -fflags +genpts standardized_video2.mp4
- list.txt 内容如下
file 'C:/Users/Rina/Desktop/视频/standardized_video1.mp4'
file 'C:/Users/Rina/Desktop/视频/standardized_video2.mp4'
- 合并
ffmpeg -f concat -safe 0 -i list.txt -c copy -fflags +genpts output.mp4
确认时长约为 10 分钟(6:08 + 3:52)。
快进到第 6:08 处,检查 standardized_video2.mp4 的音频是否正常。