查看: 8811|回复: 11
收起左侧

[技巧] 用ffmpeg的-segment_times等参数进行关键帧无损视频分割(剪切),扔掉-ss,-t,-to参数!

[复制链接]
nmyh
发表于 2021-6-6 15:46:41 | 显示全部楼层 |阅读模式
本帖最后由 nmyh 于 2021-6-8 21:35 编辑

扔掉效果并不理想的“-ss”、“-t”、“-to”参数(有损剪切重新编码才会用到的)吧!

本来是在找无损视频剪切软件,论坛有人推荐了MediaMux(https://github.com/rxaa/MediaMux),试用后发现是效果最好的(在分割又重新合并后完美还原了)。

看了下代码,发现MediaMux用的相关ffmpeg命令参数并不是“-ss”、“-t”、“-to”参数,而是“-segment_times”等参数。

然后我就把代码提取出来,发现ffmpeg v3.0也能运行,意味着WinXP系统也能无损视频分割了。

ffmpeg最新版下载页:
http://ffmpeg.org/download.html
https://www.videohelp.com/software/ffmpeg

ffmpeg v4.3.1 32bit(32位的Win7、Win10可以使用,当然也支持64位系统):
https://www.videohelp.com/download/ffmpeg-4.3.1-win32-static.zip

ffmpeg v3.0(支持WinXP系统)下载:
https://www.videohelp.com/download/ffmpeg-3.0-win32-static.7z





【关键帧无损视频分割剪切】(可手动选择每个分割的时间点)命令如下面一行:
  1. ffmpeg.exe -i "In.mp4" -f segment -segment_times 00:00:06.165,00:00:14.293 -c copy -map 0 "Out_%%02d.mp4"
复制代码
“In.mp4”是导入的视频文件名;
分割时间点“00:00:06.165”代表0小时0分6.165秒,“00:00:14.293”代表0小时0分14.293秒,由于用到了关键帧,实际结果有点出入;
多个-segment_times时间点之间用英文逗号“,”隔开;
最终会生成“Out_00.mp4”、“Out_01.mp4”、“Out_02.mp4”等视频文件(上面的两个分割时间点最终会生成3个视频文件)。


【关键帧无损视频分割剪切】(每隔多久相同时间点进行分割)命令如下面一行:
  1. ffmpeg.exe -i "In.mp4" -f segment -segment_time 00:00:05.000 -c copy -map 0 "Out_%%02d.mp4"
复制代码
仅一个-segment_time时间点,本例为每5秒分割一次(由于用到了关键帧,实际结果有点出入),最终会生成“Out_00.mp4”、“Out_01.mp4”等视频文件。



【无损视频合并】
先在视频所在路径下创建一个文本文件“list.txt”,内容如下(根据需要修改文件名,但必须是相同后缀名[比如01.ts和02.mp4就无法完成无损合并]):
  1. file '00.mp4'
  2. file '01.mp4'
  3. file '02.mp4'
复制代码
然后在同一个位置运行下面一行批处理命令:
  1. ffmpeg.exe -f concat -i "list.txt" -c copy "Out.mp4"
复制代码



评分

参与人数 1人气 +1 收起 理由
kfunname + 1

查看全部评分

kfunname
发表于 2021-6-7 13:12:21 | 显示全部楼层
本帖最后由 kfunname 于 2021-6-7 15:54 编辑

部分相同格式的视频合并,在Windows下还可以直接用copy命令,但是注意需要是格式完全相同,因为copy纯合并不转码,而且支持的格式很有限,已知ts可以,合并一些ts视频片段的时候可以用copy,无需第三方工具
用通配符的时候注意文件命名,copy会按数字顺序排列合并


  1. COPY /B a.ts+b.ts output.ts
复制代码

  1. COPY /B *.ts output.ts
复制代码

评分

参与人数 1人气 +1 收起 理由
nmyh + 1 赞一个!

查看全部评分

nmyh
 楼主| 发表于 2021-6-7 14:36:34 | 显示全部楼层
kfunname 发表于 2021-6-7 13:12
相同格式的视频合并,在Windows下还可以直接用copy命令,但是注意需要是格式完全相同,因为copy纯合并不转 ...

我试了下这个命令:
  1. COPY /B 00.mp4+01.mp4+02.mp4 all.mp4
复制代码
发现合并的视频长度还是只有第一个视频00.mp4的视频长度,没有之后的01.mp4、02.mp4的内容。

1楼的合并方法还可以把多个ts无损合并成mp4
kfunname
发表于 2021-6-7 15:52:01 | 显示全部楼层
nmyh 发表于 2021-6-7 14:36
我试了下这个命令:
发现合并的视频长度还是只有第一个视频00.mp4的视频长度,没有之后的01.mp4、02.mp4 ...

我试了下,mp4好像确实有点问题,ts可以,mp4之类的格式内部会有一些元数据控制播放,像faststart什么的,可能会有影响,纯合并就不能正常使用了,我订正一下吧
kfunname
发表于 2021-6-7 15:56:06 | 显示全部楼层
本帖最后由 kfunname 于 2021-6-7 15:58 编辑
nmyh 发表于 2021-6-7 14:36
我试了下这个命令:
发现合并的视频长度还是只有第一个视频00.mp4的视频长度,没有之后的01.mp4、02.mp4 ...

ffmpeg是智能的,默认会直接识别你的output文件扩展名,支持编码的话会直接帮你转码了,所以你用ffmpeg合并多个ts可以顺便直接转换为mp4,也可以输入多种不同格式的视频进行合并,但是默认的智能识别对复杂操作可能会不如预期,复杂操作要熟悉下ffmpeg的选项才行
nmyh
 楼主| 发表于 2021-6-7 16:11:22 | 显示全部楼层
kfunname 发表于 2021-6-7 15:56
ffmpeg是智能的,默认会直接识别你的output文件扩展名,支持编码的话会直接帮你转码了,所以你用ffmpeg合 ...

合并的所有文件必须是同一个类型(当然也包括视频尺寸),不然像下面的list.txt文本就无法成功合并视频:
  1. file '01.ts'
  2. file '02.mp4'
  3. file '03.ts'
复制代码


kfunname
发表于 2021-6-7 16:17:55 | 显示全部楼层
nmyh 发表于 2021-6-7 16:11
合并的所有文件必须是同一个类型(当然也包括视频尺寸),不然像下面的list.txt文本就无法成功合并视频: ...

所以说你要熟悉ffmpeg
不同格式合并是可以的,官方甚至有文章说明,有兴趣可以研究下
https://trac.ffmpeg.org/wiki/Concatenate#differentcodec

评分

参与人数 1人气 +1 收起 理由
nmyh + 1 感谢解答: )

查看全部评分

nmyh
 楼主| 发表于 2021-6-7 17:03:55 | 显示全部楼层
kfunname 发表于 2021-6-7 16:17
所以说你要熟悉ffmpeg
不同格式合并是可以的,官方甚至有文章说明,有兴趣可以研究下
https://trac.ffm ...

合并是可以,但是它是重新编码转换了,非无损合并。我用的命令是:
  1. ffmpeg.exe -i "01.ts" -i "02.mp4" -filter_complex "[0:v:0][0:a:0][1:v:0][1:a:0]concat=n=2:v=1:a=1[outv][outa]" -map "[outv]" -map "[outa]" "Out.mp4"
复制代码


我想加“-c copy”也能无损合并的,得到的错误是:
Streamcopy requested for output stream 0:0, which is fed from a complex filtergraph. Filtering and streamcopy cannot be used together.

不能一起使用。
kfunname
发表于 2021-6-7 17:22:14 | 显示全部楼层
本帖最后由 kfunname 于 2021-6-7 22:46 编辑
nmyh 发表于 2021-6-7 17:03
合并是可以,但是它是重新编码转换了,非无损合并。我用的命令是:

你要搞清楚转码和合并,不同编码的视频要合并起来一定要转码的;
copy是个特殊的编码器,或者说根本不是编码器,它是用于直接复制流,所以才会“无损”,实际上你的编码一变,一定会有损失,或者说修改,codec copy是不支持与filter一起用的,因为滤镜一定会编码,两者冲突的;
所以我说复杂,复杂在于如何调整各个输入流的选项以尽可能保持品质,这可以说不是能写出通用教学方案的问题,你要熟悉各类编码、ffmpeg支持的特性,根据实际文件情况才可以灵活编码以保证最好品质;

而且实际上你前面说的多个ts合并成mp4,也是“有损的”,因为转码了,实际运作是有加上mp4的编码选项的,ffmpeg智能识别到了,本质和你多个不同格式合并是一样的,只不过单一格式的情况很简单,ffmpeg可以智能处理,你看不到多个ts合并成mp4这个例子里codec copy也不起作用罢了。
这里我说错了,这里是改了容器格式。

nmyh
 楼主| 发表于 2021-6-7 17:55:20 | 显示全部楼层
本帖最后由 nmyh 于 2021-6-9 18:13 编辑
kfunname 发表于 2021-6-7 17:22
你要搞清楚转码和合并,不同格式的视频要合并起来一定要转码的,一个视频文件不能有两种视频格式,除了不 ...

我说的是不同格式但编码相同的情况。如果真要把各种编码格式的视频合并到一起那还不如用pr等软件,因为这样还可以统一不同尺寸等问题。

我前面说到的ts合并为mp4用到了参数“-c copy”,用到了这个参数就是无损合并的。我平时偶尔下载twitch的分段视频ts,然后自己用ffmpeg无损合并为mp4的
您需要登录后才可以回帖 登录 | 快速注册

本版积分规则

手机版|杀毒软件|软件论坛| 卡饭论坛

Copyright © KaFan  KaFan.cn All Rights Reserved.

Powered by Discuz! X3.4( 沪ICP备2020031077号-2 ) GMT+8, 2024-12-23 02:17 , Processed in 0.147095 second(s), 17 queries .

卡饭网所发布的一切软件、样本、工具、文章等仅限用于学习和研究,不得将上述内容用于商业或者其他非法用途,否则产生的一切后果自负,本站信息来自网络,版权争议问题与本站无关,您必须在下载后的24小时之内从您的电脑中彻底删除上述信息,如有问题请通过邮件与我们联系。

快速回复 客服 返回顶部 返回列表