비디오 파일을 대화식으로 연결


9

여러 MP4 비디오 파일을 대화 형으로 하나의 파일로 연결 (결합)하는 방법은 무엇입니까?

명령 행에서 두 파일에 대해이를 수행하는 많은 프로그램이 있습니다. 예를 들어 :

  • ffmpeg
  • avconv
  • MP4Box

그러나 우리는 이것을 대화식으로 수행하기위한 솔루션이 필요한 경우가 많습니다.


1
대화 형의 의미를 설명 할 수 있습니까?
slm

@slm 나는 사용자에게 입력 파일을 하나씩 입력 한 다음 출력 파일을 작성하도록 요청하는 프로그램을 의미합니다. 연결합니다.
Slyx 2013

이 작업을 직접 수행하는 프로그램은 본 적이 없습니다. 정보를 수집 한 다음 명령 줄을 구성하는 쉘 스크립트입니다. 당신은 당신이 가진 것보다 개선을 찾고 있습니까?
slm

@slm 나는 나와 같은 멀티미디어 사용자가 자주 필요하기 때문에 이것을 게시했습니다. 그래서 다른 사람에게 도움이되기를 바랍니다. 물론 어떤 개선도 환영합니다!
Slyx

1
@gold 나는 대기열에 편집을 넣었다. ffmpeg실제로 죽거나 쓸모 없는 것은 결코 아닙니다 . 마지막 git커밋 master15 분 전에 이루어 졌으며 매일 사용합니다.
Anko

답변:


8

최근 에이 방법을 시도하지 않았지만 왜 여전히 작동하지 않는지 알 수 없습니다. 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
  2. 사슬 같이 잇다

    $ 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

    Ubuntu ffmpeg 옵션은 여기 에 설명되어 있습니다 .


재미있는! 나는 그것이 catMP4 파일에 충분 하다는 것을 몰랐다 ! 솔루션은 대화식이 아닙니다!
Slyx 2013

@ Slyx-그래 대화 형의 의미를 묻는 이유입니다. 당신이 그것에 대해 말한 것을보고 제가 이것에 추가 할 수있는 것을 보도록하겠습니다. cat그래도 작동하는지 확인하십시오 . 내가 마지막으로 사용한 것은 .mpg파일과 함께 def입니다. 그들과 함께 일했습니다.
slm

2
나는 그것을 확인했다. 사용하는 cat것이 올바른 해결책이 아닙니다. cat두 파일을 ing 하여 생성 된 파일 은 첫 번째 입력 파일의 내용 만 표시합니다!
Slyx

@Slyx-cat은 작동하지만 타임 스탬프가 정확하지 않으므로 재생을 시도 할 때 비디오 플레이어가 타임 스탬프가 00에서 끝까지 점프 한 다음 00으로 되돌아 가면서 혼란스러워집니다. 비디오를 트랜스 코딩하려는 경우 해당 프로세스의 일부로 수정됩니다. 타임 스탬프를 재생성하는 방법도 있습니다.
slm

그것이 저의 의미이기도합니다. 두 가지 내용이 있지만 미디어 플레이어는 첫 번째 내용 만 감지합니다.
Slyx 2013

4

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 !"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.