• 利用ffmpeg的xfade转场滤镜把多个视频文件连接到一个文件的bash脚本


    FFmpeg的xfade转场,现在一共有31种效果,2020年02月10日以后的FFmpeg代码中有效;

      1 #!/bin/bash
      2 # Example of concatenating multiple mp4s together with 1-second transitions between them.
      3 
      4 transitions=( 
      5 "fade"        
      6 "wipeleft"    
      7 "wiperight"   
      8 "wipeup"      
      9 "wipedown"    
     10 "slideleft"   
     11 "slideright"  
     12 "slideup"     
     13 "slidedown"   
     14 "circlecrop"  
     15 "rectcrop"    
     16 "distance"    
     17 "fadeblack"   
     18 "fadewhite"   
     19 "radial"      
     20 "smoothleft"  
     21 "smoothright" 
     22 "smoothup"    
     23 "smoothdown"  
     24 "circleopen"  
     25 "circleclose" 
     26 "vertopen"    
     27 "vertclose"   
     28 "horzopen"    
     29 "horzclose"   
     30 "dissolve"    
     31 "pixelize"    
     32 "diagtl"      
     33 "diagtr"      
     34 "diagbl"      
     35 "diagbr"      
     36 )
     37 
     38 length=${#transitions[@]}
     39 
     40 interval=1
     41 
     42 x264="-look_ahead 0 -ac 2 -c:v h264_qsv -c:a aac -profile:v high -level 3.1 -preset:v veryfast"
     43 ki="-keyint_min 72 -g 72 -sc_threshold 0"
     44 br="-b:v 3000k -minrate 3000k -maxrate 6000k -bufsize 6000k -b:a 128k -avoid_negative_ts make_zero -fflags +genpts"
     45 
     46 duration=1
     47 function get_duration_video_ffprobe(){
     48   duration=$(ffprobe -v error -count_frames -select_streams v:0 -show_entries stream=duration -of default=nokey=1:noprint_wrappers=1 "$1")
     49   duration=$(echo "scale=3; $duration/1"|bc -l)
     50 }
     51 function get_duration_audio_ffprobe(){
     52   aduration=$(ffprobe -v error -count_frames -select_streams a:0 -show_entries stream=duration -of default=nokey=1:noprint_wrappers=1 "$1")
     53   aduration=$(echo "scale=3; $aduration/1"|bc -l)
     54 }
     55 
     56 MediaInfo="D:softMediaInfo_CLI_19.04_Windows_x64MediaInfo.exe"
     57 function get_duration_video_MediaInfo(){
     58   # duration=$($MediaInfo --Inform="Video;%Duration/String3%" "$1")
     59   duration=$($MediaInfo --Inform="Video;%Duration%" "$1")
     60   duration=$(echo "scale=3; $duration/1000"|bc -l)
     61 }
     62 function get_duration_audio_MediaInfo(){
     63   # duration=$($MediaInfo --Inform="Video;%Duration/String3%" "$1")
     64   aduration=$($MediaInfo --Inform="Audio;%Duration%" "$1")
     65   aduration=$(echo "scale=3; $aduration/1000"|bc -l)
     66 }
     67 
     68 # ls -u *.mp4       sort by time
     69 # ls *.mp4|sort     sort by name
     70 line=-1
     71 IFS=$(echo -en "
    ")
     72 for f in `ls *.mp4|sort`; do
     73      line=$((line+1))
     74      get_duration_video_MediaInfo "${f}"
     75      get_duration_audio_MediaInfo "${f}"
     76      ifd=`echo "scale=0; ${aduration}*1000-${duration}*1000"|bc -l -q`
     77      ifd=${ifd/.000/}
     78      echo ${line} ${f} ${duration} - ${aduration} = $ifd
     79      if [[ ${ifd} -le 0 ]]; then
     80        duration=${aduration}
     81      fi
     82      #echo ${line} ${f} ${duration}
     83      duration_array[${line}]=${duration}
     84      filename_array[${line}]=${f}
     85      index_array[${line}]=${line}
     86 done
     87 
     88 vfstr=""
     89 for i in ${index_array[@]}; do
     90      catlen=0$(echo ${duration_array[$i]}-${interval}|bc -l)
     91      if [ ${i} -lt ${line} ]
     92          then
     93              vfstr=${vfstr}"[$i:a]atrim=0:$catlen[a$i];"
     94          else
     95              vfstr=${vfstr}"[$i:a]atrim=0:${duration_array[$i]}[a$i];"
     96      fi
     97      vfstr=${vfstr}"[$i:v]split[v${i}00][v${i}10];"
     98 done
     99 
    100 for i in ${index_array[@]}; do
    101      catlen=0$(echo ${duration_array[$i]}-${interval}|bc -l)
    102      vfstr=${vfstr}"[v${i}00]trim=0:$catlen[v${i}01];"
    103      vfstr=${vfstr}"[v${i}10]trim=$catlen:${duration_array[$i]}[v${i}11t];"
    104      vfstr=${vfstr}"[v${i}11t]setpts=PTS-STARTPTS[v${i}11];"
    105 done
    106 
    107 for ((i=0; i<$line; ++i)) ; do
    108     Index=$[i%(($length))]
    109     #Index=$[RANDOM%(($length))]
    110     echo ${transitions[$Index]}
    111     vfstr=${vfstr}"[v${i}11][v$((i+1))01]xfade=duration=${interval}:transition=${transitions[$Index]}[vt${i}];"
    112 done
    113 
    114 vfstr=${vfstr}"[v001]"
    115 for ((i=0; i<$line; ++i)) ; do
    116     vfstr=${vfstr}"[vt${i}]"
    117 done
    118 vfstr=${vfstr}"[v${line}11]concat=n=$((line+2))[outv];"
    119 
    120 for i in ${index_array[@]}; do
    121     vfstr=${vfstr}"[a${i}]"
    122 done
    123 vfstr=${vfstr}"concat=n=$((line+1)):v=0:a=1[outa]"
    124 
    125 infile=""
    126 for i in ${filename_array[@]}; do
    127      infile=${infile}" -i "$i""
    128 done
    129 
    130 if [ ! -d "merge" ];then
    131   mkdir merge
    132 fi
    133 
    134 echo ${vfstr} > _vfstr_.txt
    135 cmd="ffmpeg -hide_banner${infile} 
    136 -filter_complex_script "_vfstr_.txt" 
    137 -map [outv] -map [outa] ${x264} ${ki} ${br} 
    138 -y ./merge/ffmpeg-xfade-concat.mp4"
    139 echo $cmd >_merge_.cmd
    140 #./_merge_.cmd
    141 
    142 echo ${cmd}
    143 bash -c "$cmd"

    更详细的参见 https://github.com/qq2225936589/xfade-ffmpeg-script
    转场效果参见 https://v.huya.com/play/270325342.html

  • 相关阅读:
    从零开始学习Sencha Touch MVC应用之二
    PHPMailer IIS下的PHP脚本使用GMAIL发送邮件PHP
    php群发邮件
    PHP编辑器
    PHP使用GET传输汉字的编码转换
    转一个手机开发的帖子(来自开发者俱乐部)
    Zend_Mail收发smtp(gmail,163)邮件Zend Framework
    just a simple for a mail() amd get array()
    ecshop二次开发 结构分析和代码研究 呵呵
    如何重置Drupal 7的用户密码
  • 原文地址:https://www.cnblogs.com/nlsoft/p/12291353.html
Copyright © 2020-2023  润新知