要将一个视频按照内容剪出其中几个部分,可以用 ffmpeg[1],操作参照 [2-4]。从 [1] 下载、安装、配环境变量之后,自己用播放器看视频,确定各片段的开始时间、结束时间,然后:
@echo off
echo part 1: paper introduction
ffmpeg -ss 00:19:16 -to 00:57:59 -i PaSS-3.mp4 -vcodec copy -acodec copy p1-paper-intro.mp4
echo part 2: story
ffmpeg -ss 00:58:00 -to 01:47:14 -i PaSS-3.mp4 -vcodec copy -acodec copy p2-story.mp4
echo part 3: Q^&A
ffmpeg -ss 01:47:15 -to 02:04:24 -i PaSS-3.mp4 -vcodec copy -acodec copy p3-QnA.mp4
其中:
-ss <HH>:<MM>:<SS>
指定开始时间;-to <HH>:<MM>:<SS>
指定结束时间;-i <INPUT>
指定要剪的视频文件(输入);- 最后一个参数是剪出来的视频片段文件名(输出)。
Multiple Segments
如果要从一个视频中剪多段拼在一起,参考 [4] 用 select filter,示例:
@echo off
setlocal enabledelayedexpansion
@REM 原视频
set IN=videos\test.mp4
@REM 输出视频:加个 `_cut` 后缀
for /F "delims=" %%f in ("%IN%") do set OUT=%%~dpf%%~nf_cut%%~xf
echo %IN% -^> %OUT%
@REM 要剪的片段
@REM 格式:between(t,<开始秒数>,<结束秒数>),可用 *、+
@REM 多段用 `+` 连接
set CLIPS='between(t,25*60+58,55*60+7)+between(t,94*60+42,119*60+31)'
echo %CLIPS%
@REM 剪
ffmpeg -i %IN% ^
-vf "select=%CLIPS%, setpts=N/FRAME_RATE/TB" ^
-af "aselect=%CLIPS%, asetpts=N/SR/TB" ^
%OUT%
Extract Audio
想从视频文件中提取音频,参考 [6]:
ffmpeg -i video.mp4 -vn -acodec copy audio.aac
想再转成 mp3 格式,给 html 用 <audio>
[8,9] 标签放,参考 [7]:
ffmpeg -i audio.aac -acodec libmp3lame audio.mp3
也可以合并成一条:
ffmpeg -i video.mp4 -vn -acodec libmp3lame audio.mp3
Cropping
要截视频的某个局部,如右半边,用 crop
参数,如:
iw
、ih
表示输入视频的原宽、高;crop
参数格式:crop=<w>:<h>:<x>:<y>
,即要截的 bounding box 是 (x, y) 到 (x + w, y + h)。
@REM 截时间用 select
set CLIPS='between(t,25*60+58,55*60+7)+between(t,94*60+42,119*60+31)'
@REM 截空间用 crop
ffmpeg -i input.mp4 ^
-vf "select=%CLIPS%, setpts=N/FRAME_RATE/TB, crop=iw/2:ih:iw/2:0" ^
-af "aselect=%CLIPS%, asetpts=N/SR/TB" ^
output.mp4