ffmpeg如何将一个视频无损分割为多个?
本帖最后由 一个学渣 于 2024-1-30 11:01 编辑已知一个时长大于1小时,大小超过1G的视频。(时长、大小均不固定)
如何使用ffmpeg将其无损分割(以下两种分割场景,不需要同时满足),
第一种:分割后每个视频时长为1小时,最后一个保留剩余时长。
第二种:分割后每个视频大小为1G,最后一个保留剩余文件大小。
用bat能不能写?如果不好写,用py辅助也行,求大佬解答! 应该可以实现的,ffprobe查看信息,然后用正则来匹配控制台输入的信息字符串,有多少时长,每秒大约有多少空间,然后用ffmpeg来分割。
不过我也没搞过,所以不会,哈哈哈哈哈 本帖最后由 zixuan203344 于 2024-1-29 10:28 编辑
百度一下就有答案:
https://blog.csdn.net/xuw_xy/article/details/119799315
# 用法说明:
`-ss :起始时间`
`-i :要分割的是频文件`
`-t :分割时长:格式如下`
`可以是 -t xx // 单位 秒`
`或者 -t 01:00:00 时:分:秒`
`注意 :-ss 要放在 -i 之前`
# 实例:
- ffmpeg -ss 00:00:00 -i Video_20210819114352835.avi -c copy -t 00:04:00 1.avi
- ffmpeg -ss 00:04:00 -i Video_20210819114352835.avi -c copy -t 00:04:00 2.avi
- ffmpeg -ss 00:08:00 -i Video_20210819114352835.avi -c copy -t 00:4:00 3.avi zixuan203344 发表于 2024-1-29 10:27
百度一下就有答案:
https://blog.csdn.net/xuw_xy/article/details/119799315
# 用法说明:
视频时长不固定,这个必须指定时长 切割的视频无法控制大小吧,例如我这个每个视频29秒(切割的时候我选的是30秒),最小的1.4M,最大的3.1M
![](https://pic.rmb.bdstatic.com/bjh/240129/4ca55572bfa96223e6e639f8e53fc28a2484.png) anwen 发表于 2024-1-29 11:02
切割的视频无法控制大小吧,例如我这个每个视频29秒(切割的时候我选的是30秒),最小的1.4M,最大的3. ...
也可以,这种该怎么写 本帖最后由 zixuan203344 于 2024-1-29 11:07 编辑
一个学渣 发表于 2024-1-29 10:39
视频时长不固定,这个必须指定时长
大小和时长是可以转换的呀,直接一除就完了
你自己bat写一个判断:
读取视频大小S,读取时长L,
设置你需要的大小c,那么每段的时长就是t=L/c,
用ffmpeg根据时长划分0-t,t-2t,2t-3t……
---
实在不行就等分
ffmpeg均匀分割视频命令
`ffmpeg -y -i input.wav -f segment -segment_time 5 output-%d.wav
-segment_time` 分割视频片段大小
`-segmenet_list <file_name> `同时生成名为file_name的文件,记录分割视频列表
`-segment_list_type <type>`
- "flat 为创建的段生成平面列表,每行一个区段。
- "csv, ext 为创建的段生成一个列表,每行一个段,每行匹配格式(逗号分隔值)
- "ffconcat 为创建的段生成 ffconcat 文件。生成的文件可以使用 FFmpeg concat 解复用器读取。
- "m3u8 生成符合 http://tools.ietf.org/id/draft-pantos-http-live-streaming 的扩展 M3U8 文件版本 3。 有专用的文件切割与合并软件 现在人工智能AI这么方便,这种需求可以考虑使用AI来提供脚本处理。
import subprocess
def get_video_duration(video_file):
# 获取视频时长
command = ['ffprobe', '-v', 'error', '-select_streams', 'v:0', '-show_entries', 'stream=duration', '-of', 'default=noprint_wrappers=1:nokey=1', video_file]
process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
output, error = process.communicate()
if process.returncode != 0:
raise Exception(f"Error occurred: {error.decode('utf-8')}")
duration = output.decode('utf-8').strip()
return duration
def split_video(video_file, output_prefix):
# 获取视频时长
duration = get_video_duration(video_file)
print(f"Video duration: {duration}")
# 分割视频
parts = []
current_time = 0
while current_time < float(duration):
part_duration = 3600# 每个部分时长为1小时(3600秒)
if current_time + part_duration > float(duration):
part_duration = int(float(duration) - current_time)
start_time = current_time
end_time = start_time + part_duration
part_name = f"{output_prefix}_{start_time:02d}_{end_time:02d}.mp4"
command = ['ffmpeg', '-i', video_file, '-ss', f"{start_time}s", '-t', f"{part_duration}s", part_name]
process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
output, error = process.communicate()
if process.returncode != 0:
raise Exception(f"Error occurred: {error.decode('utf-8')}")
parts.append(part_name)
current_time += part_duration
return parts
if __name__ == '__main__':
video_file = 'input.mp4'# 替换为你的视频文件路径
output_prefix = 'output_'# 输出文件的前缀名
try:
parts = split_video(video_file, output_prefix)
print("Video parts:", parts)
except Exception as e:
print("Error:", e) anwen 发表于 2024-1-29 11:02
切割的视频无法控制大小吧,例如我这个每个视频29秒(切割的时候我选的是30秒),最小的1.4M,最大的3. ...
用分割的方法是不可能精确到秒的 除非你重编码
页:
[1]
2