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

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

(0)

相关推荐

  • 怎么剪切/拼接视频???(premiere基础教程)

    在日常生活中,我们常常会想怎么讲自己喜欢的电影片段截取一段呢?或者将自己喜欢的电影片段拼接在一起呢?这里就让我们一起来学习吧!!! 操作方法 01 首先我们打开软件premiere 02 我们新建文件 ...

  • 如何在手机版简拼中拼接视频和照片

    手机版简拼软件被很多人使用,用来拼接视频或者照片,那么如何将视频和照片拼接在一起呢?小编就来为大家介绍一下吧.具体如下:1.  第一步,点击并打开简拼软件,接着点击页面底部箭头所指的图标.2. 第二步 ...

  • 在ffmpeg软件中怎么将音频合并到视频文件中

    今天给大家介绍一下在ffmpeg软件中怎么将音频合并到视频文件中的具体操作步骤.1. 首先我们需要进入ffmpeg官网,进行下载软件,对下载文件进行解压后,将bin文件夹复制到电脑上的另一个位置,这里 ...

  • 在PR软件中如何解决剪切的视频无法自动对齐的问题

    今天跟大家介绍一下在PR软件中如何解决剪切的视频无法自动对齐的问题的具体解决方法.1. 首先打开电脑上的PR软件,进入主页面后,将视频导入后,拖动到右侧的时间轴上,创建序列.2.接下来,根据自己的需要 ...

  • 手机中如何拼接视频

    手机中的多段视频可以通过安卓录屏大师快速拼接在一起,在拼接时候只需按顺序选择组成拼合视频的每段视频即可,没有复杂的操作,简单直接.十分方便,我将通过下面步骤演示具体操作步骤. 操作方法 01 首先需要 ...

  • 无损剪切wmv/avi/mp4等视频的方法

    无损剪切视频,不需要重新设置编码. 操作方法 01 运行 BoilsoftVideoSplitterPortable.exe 程序 02 点"打开",选择视频文件(如:.wmv) ...

  • 怎么样剪切掉视频中不需要的片段(怎么剪切视频中的一部分)

    根据音频来智能裁剪视频片段,听起来好像非常复杂,但其实这属于智能裁剪工具中的一种预设方案.如果你寻找到了正确的工具,那么操作起来其实相当的简单.你可以尝试使用万兴优转最新版本添加的智能裁剪功能,他能够 ...

  • 如何无损剪切合并mov视频

    mov格式的视频是苹果专用的视频格式,现在用iphone.ipad拍摄的视频都是这种格式的,一些相机拍摄的视频格式也是这种.MOV即QuickTime影片格式,它是Apple公司开发的一种音频.视频文 ...

  • 怎么使用优酷IDO拼接视频

    视频拼接就是把两段以上的视频根据自己的需要,意愿拼接成一段完美的视频的过程.优酷ido的视频拼接功能简单易懂.就算是初学者,也是很容易掌握的.对于有一定视频制作经验的小伙伴就没有必要再往下看了.本经验 ...