여러 MP4 비디오 파일을 대화 형으로 하나의 파일로 연결 (결합)하는 방법은 무엇입니까?
명령 행에서 두 파일에 대해이를 수행하는 많은 프로그램이 있습니다. 예를 들어 :
- ffmpeg
- avconv
- MP4Box
그러나 우리는 이것을 대화식으로 수행하기위한 솔루션이 필요한 경우가 많습니다.
답변
최근 에이 방법을 시도하지 않았지만 왜 여전히 작동하지 않는지 알 수 없습니다. cat
.mp4
연결 이외의 다른 작업을 원하지 않으면 파일을 함께 묶을 수 있다고 생각 합니다.
1. 고양이 사용
$ cat file1.mp4 file2.mp4 > file3.mp4
$ ffmpeg -i file3.mp4 -qscale:v 2 output.avi
나는 여전히 ffmpeg
항상 사용 하며 파일도 연결할 수 있습니다.
2. ffmpeg 사용
-
연결할 파일 목록 만들기
$ cat inputs.txt file sample_mpeg4.mp4 file sample_mpeg4.mp4
-
사슬 같이 잇다
$ 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 위키 : 미디어 파일을 연결 (결합, 병합)하는 방법 에서 다룹니다 .
참고 : 우분투는
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
답변
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 !"