加入收藏 | 设为首页 | 会员中心 | 我要投稿 肇庆站长网 (https://www.0758zz.cn/)- 数据分析、分布式云、安全管理、云计算、物联设备!
当前位置: 首页 > 服务器 > 搭建环境 > Linux > 正文

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

发布时间:2022-06-13 09:22:37 所属栏目:Linux 来源:互联网
导读:ffmpeg是一款视频处理工具了,我们可以在系统中安装之后利用ffmpeg命令进行视频的处理了,下面就一起来看看吧. 剪切/拼接视频文件是一种常见需求,在线视频网站现在往往将一个视频文件分割成 n 段,以减少流量消耗,使用 DownloadHelper/DownThemAll 这类工具下载
  ffmpeg是一款视频处理工具了,我们可以在系统中安装之后利用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  //phpfensi.com
        ;;
     *)
        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_*

(编辑:肇庆站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读