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

小潘seo 重庆小潘seo博客和你一起学习SEO知识,共同分享SEO优化~

ffmpeg是一款视频处理工具了,我们可以在系统中安装之后利用ffmpeg命令进行视频的处理了,下面就一起来看看吧.

剪切/拼接视频文件是一种常见需求,在线视频网站现在往往将一个视频文件分割成 n 段,以减少流量消耗,使用 DownloadHelper/DownThemAll 这类工具下载下来的往往就是分割后的文件,能实现剪切/拼接视频文件的工具多种多样,但往往都需要进行视频重编码(transcoding),这就不可避免的带来了视频质量上的损耗,更不用提那长的令人发指的转换时间了…

其实借助 ffmpeg 我们就可以在不进行视频重编码的情况下完成此类任务.

剪切代码如下:

  1. ffmpeg-iinput.mp4-ss**START_TIME**-t**STOP_TIME**-acodeccopy-vcodeccopyoutput.mp4

其中 START_TIME/STOP_TIME 的格式可以写成两种格式:

以秒为单位计数: 80

时:分:秒: 00:01:20

拼接:

拼接的情况稍微复杂些,我们需要将需要拼接的视频文件按以下格式保存在一个列表 list.txt 中,代码如下:

  1. file'/path/to/file1'
  2. file'/path/to/file2'
  3. file'/path/to/file3'

相应的命令为如下代码:

ffmpeg -f concat -i **list.txt** -c copy output.mp4

由于不需要重编码,这两条命令几乎是即时完成的,方便起见,我写了一个脚本来简化操作,放在 github 上,请自取,代码如下:

  1. #!/bin/bash
  2. #cut/joinvideosusingffmpegwithoutqualityloss
  3. if[-z$1]||[-z$2];then
  4. echo"Usage:$0c[ut]seconds<File>"
  5. echo"eg.$0c1080example.mp4"
  6. echo"eg.$0c00:00:1000:01:20example.mp4"
  7. echo"Usage:$0j[oin]<FileType>"
  8. echo"eg.$0javi"
  9. exit
  10. fi
  11. case"$1"in
  12. c)
  13. echo"cuttigvideo..."
  14. fileName=$(echo$4|cut-f1-d'.')
  15. fileType=$(echo$4|cut-f2-d'.')
  16. ffmpeg-i$4-ss$2-t$3-acodeccopy-vcodeccopy$fileName-$2-$3.$fileType
  17. ;;
  18. j)
  19. echo"joinningvideos..."
  20. rmtemp_list.txt
  21. forfin./*.$2;doecho"file'$f'">>temp_list.txt;done
  22. printf"file'%s'\n"./*.$2>temp_list.txt
  23. ffmpeg-fconcat-itemp_list.txt-ccopyoutput.$2
  24. rmtemp_list.txt//phpfensi.com
  25. ;;
  26. *)
  27. echo"wrongarguments"
  28. ;;
  29. esac
  30. exit

以上拼接操作生效的前提是,所有视频文件的格式编码相同,如果需要拼接不同格式的视频文件可以借助以下脚本,代码如下:

  1. #changethistowhatyouneed!!!
  2. EXTRA_OPTIONS='-vcodeclibx264-crf23-presetmedium-acodecaac-strictexperimental-ac2-ar44100-ab128k'
  3. ################################################################################
  4. #
  5. #NONEEDTOTOUCHANYTHINGAFTERTHISLINE!
  6. #
  7. ################################################################################
  8. #theversionofthescript
  9. VERSION=1.3
  10. #locationoftempfolder
  11. TMP=/tmp
  12. ################################################################################
  13. echo"MultiMediaConcatScriptv$VERSION(mmcat)-Ascripttoconcatenatemultiplemultimediafiles."
  14. echo"BasedonFFmpeg-www.ffmpeg.org"
  15. echo"Don'tforgettoeditthisscriptandchangeEXTRA_OPTIONS"
  16. echo""
  17. ################################################################################
  18. #syntaxcheck(hastohaveatleast3params:infile1,infile2,outfile
  19. ################################################################################
  20. if[-z$3];then
  21. echo"Syntax:$0<input1><input2><input3>...<output>"
  22. exit1
  23. fi
  24. ################################################################################
  25. #getallthecommandlineparameters,exceptforthelastone,whichisoutput
  26. ################################################################################
  27. #$first-firstparameter
  28. #$last-lastparameter(outputfile)
  29. #$inputs-alltheinputs,exceptthefirstinput,because1stinputis
  30. #handledseparately
  31. ################################################################################
  32. first=${@:1:1}
  33. last=${@:$#:1}
  34. len=$(($#-2))
  35. inputs=${@:2:$len}
  36. #removeallprevioustmpfifos(ifexist)
  37. rm-f$TMP/mcs_*
  38. ################################################################################
  39. #decodefirstinputdifferently,becausethevideoheaderdoesnothavetobe
  40. #keptforeachvideoinput,onlytheheaderfromthefirstvideoisneeded
  41. ################################################################################
  42. mkfifo$TMP/mcs_a1$TMP/mcs_v1
  43. ffmpeg-y-i$first-vn-fu16le-acodecpcm_s16le-ac2-ar44100$TMP/mcs_a12>/dev/null</dev/null&
  44. ffmpeg-y-i$first-an-fyuv4mpegpipe-vcodecrawvideo$TMP/mcs_v12>/dev/null</dev/null&
  45. #ifyouneedtologtheoutputofdecodingprocesses(usuallynotnecessary)
  46. #thenreplacethe"2>/dev/null"in2linesabovewithyourlogfilenames,likethis:
  47. #ffmpeg-y-i$first-vn-fu16le-acodecpcm_s16le-ac2-ar44100$TMP/mcs_a12>$TMP/log.a.1</dev/null&
  48. #ffmpeg-y-i$first-an-fyuv4mpegpipe-vcodecrawvideo$TMP/mcs_v12>$TMP/log.v.1</dev/null&
  49. ################################################################################
  50. #decodealltheotherinputs,removefirstlineofvideo(header)withtail
  51. #$all_aand$all_varelistsofalla/vfifos,tobeusedby"cat"lateron
  52. ################################################################################
  53. all_a=$TMP/mcs_a1
  54. all_v=$TMP/mcs_v1
  55. i=2
  56. forfin$inputs
  57. do
  58. mkfifo$TMP/mcs_a$i$TMP/mcs_v$i
  59. ffmpeg-y-i$f-vn-fu16le-acodecpcm_s16le-ac2-ar44100$TMP/mcs_a$i2>/dev/null</dev/null&
  60. {ffmpeg-y-i$f-an-fyuv4mpegpipe-vcodecrawvideo-2>/dev/null</dev/null|tail-n+2>$TMP/mcs_v$i;}&
  61. #ifyouneedtologtheoutputofdecodingprocesses(usuallynotnecessary)
  62. #thenreplacethe"2>/dev/null"in2linesabovewithyourlogfilenames,likethis:
  63. #ffmpeg-y-i$f-vn-fu16le-acodecpcm_s16le-ac2-ar44100$TMP/mcs_a$i2>$TMP/log.a.$i</dev/null&
  64. #{ffmpeg-y-i$f-an-fyuv4mpegpipe-vcodecrawvideo-2>$TMP/log.v.$i</dev/null|tail-n+2>$TMP/mcs_v$i;}&
  65. all_a="$all_a$TMP/mcs_a$i"
  66. all_v="$all_v$TMP/mcs_v$i"
  67. leti++
  68. done
  69. ################################################################################
  70. #concatenateallrawaudio/videoinputsintooneaudio/video
  71. ################################################################################
  72. mkfifo$TMP/mcs_a_all
  73. mkfifo$TMP/mcs_v_all
  74. cat$all_a>$TMP/mcs_a_all&
  75. cat$all_v>$TMP/mcs_v_all&
  76. ################################################################################
  77. #finally,encodetherawconcatenatedaudio/videointosomethinguseful
  78. ################################################################################
  79. ffmpeg-fu16le-acodecpcm_s16le-ac2-ar44100-i$TMP/mcs_a_all\
  80. -fyuv4mpegpipe-vcodecrawvideo-i$TMP/mcs_v_all\
  81. $EXTRA_OPTIONS\
  82. $last
  83. ################################################################################
  84. #removeallfifos
  85. ################################################################################
  86. rm-f$TMP/mcs_*

相关广告
  • linux中使用ffmpeg 无损剪切/拼接视频程序 linux中使用ffmpeg 无损剪切/拼接视频程序 linux中使用ffmpeg 无损剪切/拼接视频程序
相关阅读

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

2019/10/10 17:45:31 | 谷歌SEO算法 | 谷歌CEO