linux中使用ffmpeg 无损剪切/拼接视频截图程序

 
linux中使用ffmpeg 无损剪切/拼接视频截图程序
2016-09-26 19:33:40 /故事大全

剪切/拼接视频文件是一种常见需求。在线视频网站现在往往将一个视频文件分割成 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 <input1> <input2> <input3> ... <output>"

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 </dev/null &

ffmpeg -y -i $first -an -f yuv4mpegpipe -vcodec rawvideo $TMP/mcs_v1 2>/dev/null </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 </dev/null &

#ffmpeg -y -i $first -an -f yuv4mpegpipe -vcodec rawvideo $TMP/mcs_v1 2>$TMP/log.v.1 </dev/null &

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

# 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 </dev/null &

{ ffmpeg -y -i $f -an -f yuv4mpegpipe -vcodec rawvideo - 2>/dev/null </dev/null | tail -n +2 > $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 </dev/null &

#{ ffmpeg -y -i $f -an -f yuv4mpegpipe -vcodec rawvideo - 2>$TMP/log.v.$i </dev/null | tail -n +2 > $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_*

所属专题:
如果您觉得本文或图片不错,请把它分享给您的朋友吧!

 
搜索
 
 
广告
 
 
广告
 
故事大全
 
版权所有- © 2012-2015 · 故事大全 SITEMAP站点地图-Foton Auman手机看故事 站点地图-Foton Auman