<ins id='tb4vy'></ins>

    <code id='tb4vy'><strong id='tb4vy'></strong></code>

  1. <i id='tb4vy'></i>

    <acronym id='tb4vy'><em id='tb4vy'></em><td id='tb4vy'><div id='tb4vy'></div></td></acronym><address id='tb4vy'><big id='tb4vy'><big id='tb4vy'></big><legend id='tb4vy'></legend></big></address>
  2. <tr id='tb4vy'><strong id='tb4vy'></strong><small id='tb4vy'></small><button id='tb4vy'></button><li id='tb4vy'><noscript id='tb4vy'><big id='tb4vy'></big><dt id='tb4vy'></dt></noscript></li></tr><ol id='tb4vy'><table id='tb4vy'><blockquote id='tb4vy'><tbody id='tb4vy'></tbody></blockquote></table></ol><u id='tb4vy'></u><kbd id='tb4vy'><kbd id='tb4vy'></kbd></kbd>
      <dl id='tb4vy'></dl>

      <i id='tb4vy'><div id='tb4vy'><ins id='tb4vy'></ins></div></i>

        1. <fieldset id='tb4vy'></fieldset>
          <span id='tb4vy'></span>
        2. linux中使用ffmpeg 无损剪切/拼接视频程序

          • 时间:
          • 浏览:12
          • 来源:124软件资讯网

              剪切/拼接视频文件是一种常见需求  。在线视频网站现在往往将一个视频文件支解成 n 段 ,以淘汰流量消耗 。使用 DownloadHelper/DownThemAll 这类工具下载下来的往往就是支解后的文件  。能实现剪切/拼接视频文件的工具多种多样 ,但往往都需要举行视频重编码(transcoding)  ,这就不行制止的带来了视频质量上的消耗 ,更不用提那长的怒不可遏的转换时间了…

              实在借助 ffmpeg 我们就可以在不举行视频重编码的情形下完成此类使命:

              剪切:

            代码如下
            ffmpeg -i input.mp4 -ss **START_TIME** -t **STOP_TIME** -acodec copy -vcodec copy output.mp4

              其中 START_TIME/STOP_TIME 的花样可以写成两种花样:

              以秒为单元计数: 80

              时:分:秒: 00:01:20

              拼接 :

              拼接的情形稍微庞大些 ,我们需要将需要拼接的视频文件按以下花样生存在一个列表 list.txt 中:

            代码如下
            file '/path/to/file1'
            file '/path/to/file2'
            file '/path/to/file3'

              响应的下令为:

            代码如下
            ffmpeg -f concat -i **list.txt** -c copy output.mp4

              由于不需要重编码  ,这两条下令险些是即时完成的 。

              利便起见 ,我写了一个剧本来简化操作  。放在 github 上  ,请自取:

            代码如下

            #!/bin/bash
            #cut/join videos using ffmpeg without quality loss

            if [ -z $1 ] || [ -z $2 ]; then
            echo "Usage:$0 c[ut] seconds <File>"
            echo " eg. $0 c 10 80 example.mp4"
            echo " eg. $0 c 00:00:10 00:01:20 example.mp4"
            echo "Usage:$0 j[oin] <FileType>"
            echo " eg. $0 j avi"
            exit
            fi

            case "$1" in
            c)
            echo "cuttig video..."
            fileName=$(echo $4 | cut -f 1 -d '.')
            fileType=$(echo $4 | cut -f 2 -d '.')
            ffmpeg -i $4 -ss $2 -t $3 -acodec copy -vcodec copy $fileName-$2-$3.$fileType
            ;;
            j)
            echo "joinning videos..."
            rm temp_list.txt
            for f in ./*.$2; do echo "file '$f'" >> temp_list.txt; done
            printf "file '%s'\n" ./*.$2 > temp_list.txt
            ffmpeg -f concat -i temp_list.txt -c copy output.$2
            rm temp_list.txt
            ;;
            *)
            echo "wrong arguments"
            ;;
            esac
            exit

              以上拼接操作生效的条件是  ,所有视频文件的花样编码相同  ,若是需要拼接差别花样的视频文件可以借助以下剧本

            代码如下

            # change this to what you need !!!
            EXTRA_OPTIONS='-vcodec libx264 -crf 23 -preset medium -acodec aac -strict experimental -ac 2 -ar 44100 -ab 128k'

            ################################################################################
            #
            # NO NEED TO TOUCH ANYTHING AFTER THIS LINE!
            #
            ################################################################################

            # the version of the script
            VERSION=1.3

            # location of temp folder
            TMP=/tmp

            ################################################################################

            echo "MultiMedia Concat Script v$VERSION (mmcat) - A script to concatenate multiple multimedia files."
            echo "Based on FFmpeg - www.ffmpeg.org"
            echo "Don't forget to edit this script and change EXTRA_OPTIONS"
            echo ""

            ################################################################################
            # syntax check (has to have at least 3 params: infile1, infile2, outfile
            ################################################################################
            if [ -z $3 ]; then
            echo "Syntax: $0 ... "
            exit 1
            fi

            ################################################################################
            # get all the command line parameters, except for the last one, which is output
            ################################################################################
            # $first - first parameter
            # $last - last parameter (output file)
            # $inputs - all the inputs, except the first input, because 1st input is
            # handled separately
            ################################################################################
            first=${@:1:1}
            last=${@:$#:1}
            len=$(($#-2))
            inputs=${@:2:$len}

            # remove all previous tmp fifos (if exist)
            rm -f $TMP/mcs_*

            ################################################################################
            # decode first input differently, because the video header does not have to be
            # kept for each video input, only the header from the first video is needed
            ################################################################################
            mkfifo $TMP/mcs_a1 $TMP/mcs_v1

            ffmpeg -y -i $first -vn -f u16le -acodec pcm_s16le -ac 2 -ar 44100 $TMP/mcs_a1 2>/dev/null ffmpeg -y -i $first -an -f yuv4mpegpipe -vcodec rawvideo $TMP/mcs_v1 2>/dev/null
            # if you need to log the output of decoding processes (usually not necessary)
            # then replace the "2>/dev/null" in 2 lines above with your log file names, like this:
            #ffmpeg -y -i $first -vn -f u16le -acodec pcm_s16le -ac 2 -ar 44100 $TMP/mcs_a1 2>$TMP/log.a.1 #ffmpeg -y -i $first -an -f yuv4mpegpipe -vcodec rawvideo $TMP/mcs_v1 2>$TMP/log.v.1
            ################################################################################
            # decode all the other inputs, remove first line of video (header) with tail
            # $all_a and $all_v are lists of all a/v fifos, to be used by "cat" later on
            ################################################################################
            all_a=$TMP/mcs_a1
            all_v=$TMP/mcs_v1
            i=2
            for f in $inputs
            do
            mkfifo $TMP/mcs_a$i $TMP/mcs_v$i

            ffmpeg -y -i $f -vn -f u16le -acodec pcm_s16le -ac 2 -ar 44100 $TMP/mcs_a$i 2>/dev/null { ffmpeg -y -i $f -an -f yuv4mpegpipe -vcodec rawvideo - 2>/dev/null $TMP/mcs_v$i ; } &

            # if you need to log the output of decoding processes (usually not necessary)
            # then replace the "2>/dev/null" in 2 lines above with your log file names, like this:
            #ffmpeg -y -i $f -vn -f u16le -acodec pcm_s16le -ac 2 -ar 44100 $TMP/mcs_a$i 2>$TMP/log.a.$i #{ ffmpeg -y -i $f -an -f yuv4mpegpipe -vcodec rawvideo - 2>$TMP/log.v.$i $TMP/mcs_v$i ; } &

            all_a="$all_a $TMP/mcs_a$i"
            all_v="$all_v $TMP/mcs_v$i"
            let i++
            done

            ################################################################################
            # concatenate all raw audio/video inputs into one audio/video
            ################################################################################
            mkfifo $TMP/mcs_a_all
            mkfifo $TMP/mcs_v_all
            cat $all_a > $TMP/mcs_a_all &
            cat $all_v > $TMP/mcs_v_all &

            ################################################################################
            # finally, encode the raw concatenated audio/video into something useful
            ################################################################################
            ffmpeg -f u16le -acodec pcm_s16le -ac 2 -ar 44100 -i $TMP/mcs_a_all \
            -f yuv4mpegpipe -vcodec rawvideo -i $TMP/mcs_v_all \
            $EXTRA_OPTIONS \
            $last

            ################################################################################
            # remove all fifos
            ################################################################################
            rm -f $TMP/mcs_*