Nei*_*eil 518 video ffmpeg command-line processing
我正在使用ffmpeg像这样剪切大文件的一部分:
ffmpeg -i input.wmv -ss 60 -t 60 -acodec copy -vcodec copy output.wmv
Run Code Online (Sandbox Code Playgroud)
该-ss部分工作正常,但-t被忽略。它正确地删除了指定的初始指定秒数,-ss然后继续使用副本到达输入的末尾。
有没有办法在ffmpeg不重新编码的情况下切断视频的结尾?
小智 608
您可以使用该-ss选项指定开始时间戳,并使用该-t选项指定编码持续时间。时间戳需要采用HH:MM:SS.xxx格式或以秒 ( s.msec) 为单位。
以下将剪辑前 30 秒,然后剪辑之后 10 秒的所有内容:
ffmpeg -ss 00:00:30.0 -i input.wmv -c copy -t 00:00:10.0 output.wmv
ffmpeg -ss 30 -i input.wmv -c copy -t 10 output.wmv
Run Code Online (Sandbox Code Playgroud)
请注意,这-t是一个输出选项,始终需要在之后 指定-i。
一些技巧:
-ssafter -i,您可以获得更准确的搜索,但执行速度会变慢。另请参阅:使用 FFmpeg 搜索您可以使用-to而不是-t指定要剪切到的时间戳。所以,-i <input> -ss 30 -t 10你也可以做-i <input> -ss 30 -to 40同样的事情来代替。
如果您的 ffmpeg 不支持-c, 或-to,则它可能非常过时。自己编译一个新版本或从他们的主页下载一个静态版本。真的不复杂。
小智 162
正如其他人所提到的,放在-ss之前(更快)或之后(更准确)-i会产生很大的不同。ffmpeg 搜索页面上的“快速准确搜索”部分告诉您如何获取两者,我已经使用了它,它有很大的不同。基本上你放在-ss之前和之后-i,只要确保在你想要开始切割的地方之前留出足够的时间来获得另一个关键帧。示例:如果您想在 Video.mp4 中制作 1 分钟的剪辑,从 9 分 0 秒到 10 分 0 秒,您可以使用以下方法快速准确地完成:
ffmpeg -ss 00:08:00 -i Video.mp4 -ss 00:01:00 -t 00:01:00 -c copy VideoClip.mp4
Run Code Online (Sandbox Code Playgroud)
第一个-ss快速搜索到(大约)8 分钟,然后第二个-ss准确搜索到 9 分钟,然后-t 00:01:00取出一个 1 分钟的剪辑。
还要注意该页面中的这一要点:“如果您使用-sswith -c:v copy,则生成的比特流最终可能会断断续续、不可播放或与音频流不同步,因为 ffmpeg 被迫仅在 i 帧上使用/拆分。 ”
这意味着您需要重新编码视频,即使您只想复制它,否则可能会出现断断续续和不同步的风险。你可以先尝试-c copy,但如果视频很糟糕,你需要重新做。
Chr*_*ris 42
我发现-ss结合起来会-c copy在开始时产生半秒的斩波。
为避免这种情况,您必须删除-c copy(无可否认会进行转码)。
小智 15
在媒体播放器中打开文件,该播放器将逐帧播放并播放包含以下数据的AVISynth 文件:
DirectShowSource(("C:\Downloads\Video\Do you want him.flv"), Pixel_Type="yuy2").Crop(0,0,-0,-0)
Subtitle("C:\Downloads\Video\Do you want him.flv", font="Arial", size=24, text_color=$ff0000, align=3)
ShowFrameNumber(scroll=true, x=336, y=27, font="Arial", size=24, text_color=$ff0000)
ShowTime(x=398, y=44, font="Arial", size=24, text_color=$ff0000)
Run Code Online (Sandbox Code Playgroud)
然后使用 EXACT 时间格式进行剪切:
ffmpeg -i "Path\do you want him.flv" \
-ss 00:00:05.240 -to 00:00:08.360 \
-vcodec libx264 -acodec libvo_aacenc \
"Path\Do you want him1.flv"
Run Code Online (Sandbox Code Playgroud)
和
ffmpeg -i "Path\do you want him.flv" \
-ss 00:00:10.240 -to 00:00:14.360 \
-vcodec libx264 -acodec libvo_aacenc \
"Path\Do you want him2.flv"
Run Code Online (Sandbox Code Playgroud)
现在用视频文件制作一个txt文件,内容如下:
file 'C:\Downloads\Video\Do you want him1.flv'
file 'C:\Downloads\Video\Do you want him2.flv'
Run Code Online (Sandbox Code Playgroud)
运行 ffmpeg:
ffmpeg -f concat -i FileList.txt -c copy "Path\NewName_joined.flv"
Run Code Online (Sandbox Code Playgroud)
Zim*_*mba 10
使用这种格式:
ffmpeg <start time> <input file> <cut duration> <out file>
Run Code Online (Sandbox Code Playgroud)
例如。在 1 分钟的视频后剪切 60 秒的剪辑
ffmpeg.exe -ss 00:01:00 -i "in file.mp4" -to 00:01:00 -c copy out.mp4
注意:输入文件之前的
开始时间更快。输入文件准确/精确后的开始时间。
小智 8
对我来说,-t选项没有用,但-vframes有效。我更喜欢使用#frames,因为我宁愿在 I-Frames 处进行剪辑,而且我使用ffprobe.
对我有用的命令行是:
ffmpeg -ss 60s -i input.wmv -vframes 1800 -acodec copy -vcodec copy output.wmv
Run Code Online (Sandbox Code Playgroud)
顺便说一句,放在-ss前面对-i执行时间有很大影响。
小智 5
与 user225366 一样,-t 选项不适用于短视频,但适用于较长的视频。对于短视频,似乎 -frames:v 更好。这对我有用。
ffmpeg -ss 4 -i input.mp4 -frames:v 200 -vcodec copy output.mp4
Run Code Online (Sandbox Code Playgroud)
如果视频有音频,则需要添加 -acodec 副本,如其他答案所示。