国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Linux > 正文

linux中使用ffmpeg 無損剪切/拼接視頻程序

2020-05-27 13:12:16
字體:
來源:轉載
供稿:網友

   剪切/拼接視頻文件是一種常見需求。在線視頻網站現在往往將一個視頻文件分割成 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 "Dont 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_*

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 阿拉善右旗| 博野县| 襄樊市| 廊坊市| 大渡口区| 麟游县| 通道| 库尔勒市| 达拉特旗| 湛江市| 施甸县| 呼图壁县| 石嘴山市| 北宁市| 马龙县| 万年县| 南通市| 芒康县| 高台县| 上杭县| 土默特左旗| 固阳县| 大余县| 深圳市| 达尔| 元江| 牟定县| 大荔县| 甘洛县| 雷州市| 突泉县| 米脂县| 休宁县| 苏尼特右旗| 昌平区| 浠水县| 滨州市| 石台县| 彰化县| 杭州市| 行唐县|