V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
Sponsored by
LinkedIn
不坐班的神仙工作 · 去任何你想去的地方远程,赚一线城市的工资
2000 个不用出门 Social 的全球远程工作,帮助 V2EX 的小伙伴开启全新的工作方式。
Promoted by LinkedIn
zjvbqla
V2EX  ›  问与答

求个小脚本写法!

  •  
  •   zjvbqla · 57 天前 · 954 次点击
    这是一个创建于 57 天前的主题,其中的信息可能已经有所发展或是发生改变。

    用 ffmpeg 把目录 a 下的所有 mp4 文件切割成 8 秒一段,并且建立视频名称为名的文件夹。

    比如 a 文件夹下 123.mp4 40 秒钟,234.mp4 80 秒, 运行后就变成目录下这 2 个 mp4 不变,a 目录内多了 2 个文件夹,分别是 123 和 234 。 123 存放了切成 5 段的 123.mp4 。 234 成放了切成 10 段的 234.mp4

    a
    ├── 123.mp4
    ├── 234.mp4
    ├── 123
    │   ├── 123+0001.mp4
    │   ├── 123+0002.mp4
    │   └── 123+0003.mp4
    └── 234
        ├── 234+0001.mp4
       ├── 234+0002.mp4
        ├── 234+0003.mp4
        └── 234+0004.mp4
    

    最后的输出最好是“目录名+0001.mp4”“目录名+0002.mp4”“目录名+0003.mp4”

    shell 和 python 均可。

    ffmpeg 写法是

    ffmpeg -i /Users/abu/Movies/示例.mp4 -c copy -map 0 -segment_time 8 -f segment output%03d.mp4
    
    9 条回复    2022-08-01 18:57:57 +08:00
    eason1874
        1
    eason1874  
       57 天前
    大概这样,目录名最好别跟文件同名,我这里的格式是 123 对应 123-segments

    ```
    import os
    import glob

    mp4filelist = glob.glob("/opt/videos/*.mp4")
    for mp4file in mp4filelist:
    basename = os.path.basename(mp4file)
    segmentsdir= f"{mp4file}-segments"
    if not os.path.exists(segmentsdir):
    os.makedirs(segmentsdir)
    os.system(f"ffmpeg -i {mp4file} -c copy -map 0 -segment_time 8 -f segment {segmentsdir}/{basename}+%03d.mp4")
    ```
    anlegong
        2
    anlegong  
       57 天前
    a
    ├── 123.mp4
    ├── 234.mp4
    ├── 123
    │ ├── 123+0001.mp4
    │ ├── 123+0002.mp4
    │ └── 123+0003.mp4
    └── 234
    ├── 234+0001.mp4
    ├── 234+0002.mp4
    ├── 234+0003.mp4
    └── 234+0004.mp4

    歪个楼,,,

    这个是怎么生成的,有什么专用的小工具或脚本命令吗?
    eason1874
        3
    eason1874  
       57 天前   ❤️ 1
    发出来空格被吞了,你自己加上吧,也就几句,应该不难
    zjvbqla
        4
    zjvbqla  
    OP
       57 天前
    @anlegong tree 命令
    zjvbqla
        5
    zjvbqla  
    OP
       57 天前
    @eason1874 好 我研究下,还不太会玩。
    monzuguan
        6
    monzuguan  
       56 天前   ❤️ 1
    kkocdko
        7
    kkocdko  
       56 天前
    建议直接输出 m3u8 ,会自动切好 ts ,然后再批量转回 mp4 。
    使用 -c copy 参数,不会重新编码。
    ruidoBlanco
        8
    ruidoBlanco  
       55 天前   ❤️ 1
    不能一行写了算我输。

    for i in *.mp4; do name=${i%%.mp4} ; mkdir -p $name; ffmpeg -i $i -c copy -map 0 -segment_time 8 -f segment "${name}/${name}%03d.mp4"; done
    zjvbqla
        9
    zjvbqla  
    OP
       55 天前
    @ruidoBlanco 给力。
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   997 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 20:43 · PVG 04:43 · LAX 13:43 · JFK 16:43
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.