Bash

互動式連接影片文件

  • September 27, 2015

如何以互動方式將多個 MP4 影片文件連接(加入)到一個文件中?

有很多程序可以從命令行對兩個文件執行此操作。例如:

  • ffmpeg
  • avconv
  • MP4盒

但是我們經常需要一個解決方案來互動地執行此操作。

我使用 MP4Box 作為工作基地。

我建議的腳本一一讀取所有文件,驗證每個文件(如果它是普通文件),要求使用者輸入要創建的文件名。

#!/bin/bash
printf "###  Concatenate Media files ###\n"
fInputCount=0
# Reading input files
IFS=''
while (true)
do
   let currentNumber=$fInputCount+1 
   printf "File n°%s (\"ok\" to finish): " $currentNumber
   read inputFile
   [ "$inputFile" == "ok" ] && break
   [ ! -e "$inputFile" ] || [ ! -f "$inputFile" ] && printf "\"%s\" : Invalid filename. Skipped !\n" "$inputFile" && continue
   ((fInputCount++))
   inputFileList[$fInputCount]=$inputFile
   printf "\"%s\" : Added to queue !\n" "$inputFile"
done
[ "$fInputCount" == "0" ] || [ "$fInputCount" == "1" ] && echo "No enough input data. BYE ! " && exit
# Listing the input file list 
for ((i=1;i<=$fInputCount;i++))
do
   printf "%2d : %s\n" $i ${inputFileList[$i]}
done
# Reading the output filename
while (true)
do
   printf "Output file without extention (\"none\" to dismiss) : "
   read outputRead
   [ "$outputRead" == "none" ] && echo "Dismissed. BYE ! " && exit
   [ "$outputRead" == "" ] && echo "Try again ! " && continue
   [ -e "$outputRead" ] && echo "\"$outputRead\" exists. Try again !" && continue
   outputFile=$outputRead.mp4
   echo "Output to \"$outputFile\". Go !" && break
done
# Creating a random temporary filename
tmpOutFile="/tmp/concatMedia"`date +"%s%N"| sha1sum | awk '{print $1}'`".mp4"
# Joining the two first input files
MP4Box -cat "${inputFileList[1]}" -cat "${inputFileList[2]}" $tmpOutFile
# Adding all other files
for ((i=3;i<=$fInputCount;i++))
do
   tmpIntermediateFile=$tmpOutFile
   tmpOutFile="/tmp/concatMedia"`date +"%s%N"| sha1sum | awk '{print $1}'`".mp4"
   MP4Box -cat $tmpIntermediateFile -cat "${inputFileList[$i]}" $tmpOutFile
   rm $tmpIntermediateFile
done
mv $tmpOutFile "$outputFile"
# Finished
echo "\"$outputFile\" Saved !"

我最近沒有嘗試過這種方法,但不明白為什麼它仍然不起作用。我相信cat .mp4如果你不想做任何事情,除了連接它們,你可以把它們放在一起。

1.使用貓

$ cat file1.mp4 file2.mp4 > file3.mp4
$ ffmpeg -i file3.mp4 -qscale:v 2 output.avi

我仍然ffmpeg一直在使用,它也可以連接文件。

2.使用ffmpeg

  1. 製作要連接的文件列表
$ cat inputs.txt 
file sample_mpeg4.mp4
file sample_mpeg4.mp4
  1. 連接
$ ffmpeg -f concat -i inputs.txt -c copy out.mp4

$ ll |grep -E "sample|out"
-rw-rw-r--. 1 saml saml 491860 Feb 19 23:36 out.mp4
-rw-r--r--. 1 saml saml 245779 Feb 19 23:32 sample_mpeg4.mp4

FFmpeg wiki 中介紹了其他方法:如何連接(加入、合併)媒體文件

注意: Ubuntu 似乎不支持該concat格式。您必須使用 concat 協議。此外,它具有每個流編解碼器選項。因此,使用 concat 協議的結果如下:

$ ffmpeg -i input1.mp4 -vcodec copy -acodec copy \
    -vbsf h264_mp4toannexb -f mpegts intermediate1.ts

$ ffmpeg -i input2.mp4 -vcodec copy -acodec copy \
    -vbsf h264_mp4toannexb -f mpegts intermediate2.ts

$ ffmpeg -i "concat:intermediate1.ts|intermediate2.ts" \
    -vcodec copy -acodec copy -absf aac_adtstoasc output.mp4

此處記錄了 Ubuntu ffmpeg 選項。

引用自:https://unix.stackexchange.com/questions/116035