一个学渣 发表于 2024-1-29 10:17

ffmpeg如何将一个视频无损分割为多个?

本帖最后由 一个学渣 于 2024-1-30 11:01 编辑

已知一个时长大于1小时,大小超过1G的视频。(时长、大小均不固定)

如何使用ffmpeg将其无损分割(以下两种分割场景,不需要同时满足),
第一种:分割后每个视频时长为1小时,最后一个保留剩余时长。
第二种:分割后每个视频大小为1G,最后一个保留剩余文件大小。


用bat能不能写?如果不好写,用py辅助也行,求大佬解答!

KaneHiroshi 发表于 2024-1-29 10:24

应该可以实现的,ffprobe查看信息,然后用正则来匹配控制台输入的信息字符串,有多少时长,每秒大约有多少空间,然后用ffmpeg来分割。
不过我也没搞过,所以不会,哈哈哈哈哈

zixuan203344 发表于 2024-1-29 10:27

本帖最后由 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

一个学渣 发表于 2024-1-29 10:39

zixuan203344 发表于 2024-1-29 10:27
百度一下就有答案:
https://blog.csdn.net/xuw_xy/article/details/119799315
# 用法说明:


视频时长不固定,这个必须指定时长

anwen 发表于 2024-1-29 11:02

切割的视频无法控制大小吧,例如我这个每个视频29秒(切割的时候我选的是30秒),最小的1.4M,最大的3.1M
![](https://pic.rmb.bdstatic.com/bjh/240129/4ca55572bfa96223e6e639f8e53fc28a2484.png)

一个学渣 发表于 2024-1-29 11:04

anwen 发表于 2024-1-29 11:02
切割的视频无法控制大小吧,例如我这个每个视频29秒(切割的时候我选的是30秒),最小的1.4M,最大的3. ...

也可以,这种该怎么写

zixuan203344 发表于 2024-1-29 11:05

本帖最后由 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。

sai609 发表于 2024-1-29 11:10

有专用的文件切割与合并软件

mmaaiiooo 发表于 2024-1-29 11:13

现在人工智能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)

lanvas2008 发表于 2024-1-29 11:17

anwen 发表于 2024-1-29 11:02
切割的视频无法控制大小吧,例如我这个每个视频29秒(切割的时候我选的是30秒),最小的1.4M,最大的3. ...

用分割的方法是不可能精确到秒的 除非你重编码
页: [1] 2
查看完整版本: ffmpeg如何将一个视频无损分割为多个?