吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1535|回复: 16
收起左侧

[已解决] ffmpeg如何将一个视频无损分割为多个?

 关闭 [复制链接]
一个学渣 发表于 2024-1-29 10:17
本帖最后由 一个学渣 于 2024-1-30 11:01 编辑

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

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


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

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
LightSaber + 1 + 1 我很赞同!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

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
[md]# 用法说明:

视频时长不固定,这个必须指定时长
anwen 发表于 2024-1-29 11:02

切割的视频无法控制大小吧,例如我这个每个视频29秒(切割的时候我选的是30秒),最小的1.4M,最大的3.1M

 楼主| 一个学渣 发表于 2024-1-29 11:04
anwen 发表于 2024-1-29 11:02
[md]切割的视频无法控制大小吧,例如我这个每个视频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。

免费评分

参与人数 1热心值 +1 收起 理由
一个学渣 + 1 我很赞同!

查看全部评分

sai609 发表于 2024-1-29 11:10
有专用的文件切割与合并软件
mmaaiiooo 发表于 2024-1-29 11:13
现在人工智能AI这么方便,这种需求可以考虑使用AI来提供脚本处理。
image.png

[Python] 纯文本查看 复制代码
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
[md]切割的视频无法控制大小吧,例如我这个每个视频29秒(切割的时候我选的是30秒),最小的1.4M,最大的3. ...

用分割的方法是不可能精确到秒的 除非你重编码

免费评分

参与人数 1热心值 +1 收起 理由
goblack + 1 无损转ts再裁就是准的,看你楼下那贴就对的

查看全部评分

您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 16:02

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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