如何用ffmpeg截取视频片段&截取时间不准确的坑

简介: 之前在工作中,有遇到需要程序化截取视频片段的场景,这里使用ffmpeg命令行就可以很容易实现,这里也记录下我们使用过程中遇到的坑,希望对大家也有所帮助。 举个例子,当我们要截取视频文件中input.mp4的第15秒到第98秒时,ffmpeg命令行可以这么写:

之前在工作中,有遇到需要程序化截取视频片段的场景,这里使用ffmpeg命令行就可以很容易实现,这里也记录下我们使用过程中遇到的坑,希望对大家也有所帮助。

  举个例子,当我们要截取视频文件中input.mp4的第15秒到第98秒时,ffmpeg命令行可以这么写:


ffmpeg -ss 15 -to 98 -i input.mp4 -c:v copy output.mp4


  这里的参数-c:v copy 指的是复用原始视频的编码格式,如果想切换视频编码也可以直接指定,比如-c:v libx264 (关于修改视频和音频编码的问题,后续会继续出一篇博客)。另外-ss和-to后面也可以写成时:分:秒的格式,比如要截取视频00:12:01开始到00:15:21的视频,命令行就可以写成如下:


ffmpeg -ss 00:12:01 -to 00:15:21 -i input.mp4 -c:v copy output.mp4


  如果先从某个时间点开始,截取之后的多少秒视频,我们可以将-to参数替换为-t参数,比如我想从视频的00:12:01开始截取之后的60秒视频,命令行就也这么写:


ffmpeg -ss 00:12:01 -t 60 -i input.mp4 -c:v copy output.mp4


 这里需要注意的是如果你同时使用了-t和-to参数,那么ffmpeg会优先使用-t参数的值,也就是说-to参数无效 。


-ss指定起始时间点不准确的问题

  这里再补充一个我们使用中遇到的坑,就是视频截取时间点不准确的问题,以上命令行在我们生产环境中开始还能正常使用,但随着我们输入的视频时长越来越长,我们发现截取出来的视频越来越不对,比如我想从第5分钟截取到第10分钟,结果上面命令行给截出来的是第3分钟到第6分钟的视频。

  后来查阅ffmpeg官网发现,-ss参数有坑,其放在-i前和后的效果不一样,官网是这么介绍-ss参数的:


-ss position (input/output)

When used as an input option (before -i), seeks in this input file to position. Note that in most formats it is not possible to seek exactly, so ffmpeg will seek to the closest seek point before position. When transcoding and -accurate_seek is enabled (the default), this extra segment between the seek point and position will be decoded and discarded. When doing stream copy or when -noaccurate_seek is used, it will be preserved.

When used as an output option (before an output url), decodes but discards input until the timestamps reach position.

position must be a time duration specification, see (ffmpeg-utils)the Time duration section in the ffmpeg-utils(1) manual.


  官方还特意提醒了下,当-ss放在-i参数前,其搜索到的时间点位置是不准确的,ffmpeg只能检索到目标时间点之前最近的某个点。当-ss参数在-i参数之后,ffmpeg会将视频重新解码,然后丢弃目标起始时间点之前的视频,这样截取的视频起始时间点才是准确的,但貌似执行速度会慢很多(可能是涉及到视频解码)。

  所以以上几条命令,要想在任何输入下拿到预期结果,就应该这么写:


ffmpeg -i input.mp4 -ss 15 -to 98 -c:v copy output.mp4 
ffmpeg -i input.mp4 -ss 00:12:01 -to 00:15:21 -c:v copy output.mp4  
ffmpeg -i input.mp4 -ss 00:12:01 -t 60 -c:v copy output.mp4


参考资料

ffmpeg 命令行参数

目录
相关文章
|
11天前
|
编解码 监控 网络协议
如何使用FFmpeg实现RTSP推送H.264和H.265(HEVC)编码视频
本文详细介绍了如何使用FFmpeg实现RTSP推送H.264和H.265(HEVC)编码视频。内容涵盖环境搭建、编码配置、服务器端与客户端实现等方面,适合视频监控系统和直播平台等应用场景。通过具体命令和示例代码,帮助读者快速上手并实现目标。
37 6
|
3月前
|
编解码 Linux
CentOS安装ffmpeg并转码视频为mp4
CentOS安装ffmpeg并转码视频为mp4
144 0
|
5月前
|
Python
Python使用ffmpeg下载m3u8拼接为视频
Python使用ffmpeg下载m3u8拼接为视频
|
28天前
|
Java 数据安全/隐私保护
Java ffmpeg 实现视频加文字/图片水印功能
【10月更文挑战第22天】在 Java 中使用 FFmpeg 实现视频加文字或图片水印功能,需先安装 FFmpeg 并添加依赖(如 JavaCV)。通过构建 FFmpeg 命令行参数,使用 `drawtext` 滤镜添加文字水印,或使用 `overlay` 滤镜添加图片水印。示例代码展示了如何使用 JavaCV 实现文字水印。
|
1月前
|
计算机视觉 Python
FFMPEG学习笔记(一): 提取视频的纯音频及无声视频
本文介绍了如何使用FFmpeg工具从视频中提取纯音频和无声视频。提供了具体的命令行操作,例如使用`ffmpeg -i input.mp4 -vn -c:a libmp3lame output.mp3`来提取音频,以及`ffmpeg -i input.mp4 -c:v copy -an output.mp4`来提取无声视频。此外,还包含了一个Python脚本,用于批量处理视频文件,自动提取音频和生成无声视频。
44 1
|
1月前
FFmpeg学习笔记(二):多线程rtsp推流和ffplay拉流操作,并储存为多路avi格式的视频
这篇博客主要介绍了如何使用FFmpeg进行多线程RTSP推流和ffplay拉流操作,以及如何将视频流保存为多路AVI格式的视频文件。
169 0
|
5月前
|
Web App开发 安全 Linux
FFmpeg开发笔记(二十六)Linux环境安装ZLMediaKit实现视频推流
《FFmpeg开发实战》书中介绍轻量级流媒体服务器MediaMTX,但其功能有限,不适合生产环境。推荐使用国产开源的ZLMediaKit,它支持多种流媒体协议和音视频编码标准。以下是华为欧拉系统下编译安装ZLMediaKit和FFmpeg的步骤,包括更新依赖、下载源码、配置、编译、安装以及启动MediaServer服务。此外,还提供了通过FFmpeg进行RTSP和RTMP推流,并使用VLC播放器拉流的示例。
276 3
FFmpeg开发笔记(二十六)Linux环境安装ZLMediaKit实现视频推流
|
5月前
|
编解码 Linux 计算机视觉
python 调用ffmpeg使用usb摄像头录制视频,输出h264格式,自动获取摄像头的最佳帧率和最大画面尺寸
使用 Python 调用 FFmpeg 进行 USB 摄像头视频录制,需先确保安装 FFmpeg 和 Python 的 `subprocess` 模块。代码示例展示了如何自动获取摄像头的最佳帧率和最大分辨率,然后录制视频。首先通过 FFmpeg 列出摄像头格式获取信息,解析出帧率和分辨率,选择最优值。之后调用 FFmpeg 命令录制视频,设置帧率、分辨率等参数。注意 `/dev/video0` 是 Linux 的摄像头设备路径,Windows 系统需相应调整。代码中未直接实现自动获取最佳参数,通常需要借助其他库如 OpenCV。
|
5月前
|
Linux 开发工具
Linux下视频截取命令 使用【ffmpeg】使用
Linux下视频截取命令 使用【ffmpeg】使用
49 1
|
6月前
|
编解码 C语言
FFMPEG 获取视频PTS
FFMPEG 获取视频PTS
87 0

热门文章

最新文章