zoukankan      html  css  js  c++  java
  • A script for splitting videos using ffmpeg

    Here is a small bash script for automatically cutting a video file into smaller chunks of fixed length. ffmpeg cannot output multiple files, but it has start offset and duration parameters which my script uses to actually split the file.

    For example, if we have a video called 'video.mpeg' which is 3000 seconds long and we run

    ffsplit.sh video.mpeg 1200

    we will obtain three files : video-001.mpeg (1200 seconds), video-002.mpeg (1200 seconds) and video-003.mpeg (600 seconds).

     #!/bin/bash

     
    # Written by Alexis Bezverkhyy <alexis@grapsus.net> in 2011
    # This is free and unencumbered software released into the public domain.
    For more information, please refer to <http://unlicense.org/>
     
    function usage {
            echo "Usage : ffsplit.sh input.file chunk-duration [output-filename-format]"
            echo -e "\t - input file may be any kind of file reconginzed by ffmpeg"
            echo -e "\t - chunk duration must be in seconds"
            echo -e "\t - output filename format must be printf-like, for example myvideo-part-%04d.avi"
            echo -e "\t - if no output filename format is given, it will be computed\
     automatically from input filename"
    }
     
    IN_FILE="$1"
    OUT_FILE_FORMAT="$3"
    typeset -i CHUNK_LEN
    CHUNK_LEN="$2"
     
    DURATION_HMS=$(ffmpeg -i "$IN_FILE" 2>&1 | grep Duration | cut -f 4 -d ' ')
    DURATION_H=$(echo "$DURATION_HMS" | cut -d ':' -f 1)
    DURATION_M=$(echo "$DURATION_HMS" | cut -d ':' -f 2)
    DURATION_S=$(echo "$DURATION_HMS" | cut -d ':' -f 3 | cut -d '.' -f 1)
    let "DURATION = ( DURATION_H * 60 + DURATION_M ) * 60 + DURATION_S"
     
    if [ "$DURATION" = '0' ] ; then
            echo "Invalid input video"
            usage
            exit 1
    fi
     
    if [ "$CHUNK_LEN" = "0" ] ; then
            echo "Invalid chunk size"
            usage
            exit 2
    fi
     
    if [ -z "$OUT_FILE_FORMAT" ] ; then
            FILE_EXT=$(echo "$IN_FILE" | sed 's/^.*\.\([a-zA-Z0-9]\+\)$/\1/')
            FILE_NAME=$(echo "$IN_FILE" | sed 's/^\(.*\)\.[a-zA-Z0-9]\+$/\1/')
            OUT_FILE_FORMAT="${FILE_NAME}-%03d.${FILE_EXT}"
            echo "Using default output file format : $OUT_FILE_FORMAT"
    fi
     
    N='1'
    OFFSET='0'
    let 'N_FILES = DURATION / CHUNK_LEN + 1'
     
    while [ "$OFFSET" -lt "$DURATION" ] ; do
            OUT_FILE=$(printf "$OUT_FILE_FORMAT" "$N")
            echo "writing $OUT_FILE ($N/$N_FILES)..."
            ffmpeg -i "$IN_FILE" -vcodec copy -acodec copy -ss "$OFFSET" -t "$CHUNK_LEN" "$OUT_FILE"
            let "N = N + 1"
            let "OFFSET = OFFSET + CHUNK_LEN"
    done
  • 相关阅读:
    Spring.NET企业架构实践之 NHibernate + Spring.NET + WCF + Windows服务 + Silverlight 中小企业应用架构完整Demo
    UnitOfWork模式和Repository模式[转]
    倾情奉献:开源企业类库(EntLib)大分享
    Spring.NET企业架构实践之Nhibernate + WCF + ASP.NET MVC + NVelocity 对PetShop4.0重构(一)——架构设计
    WCF服务
    EA使用教程
    第三方支付接口,银行接口(附下载),third party bank interface
    ASP.NET 开发 WAP 网站
    开源软件Mono框架和架构
    wcf asp.net
  • 原文地址:https://www.cnblogs.com/elesos/p/2994791.html
Copyright © 2011-2022 走看看