우분투에서 여러 비디오를 병합하는 방법은 무엇입니까?


38

각각 20 개의 배치 크기로 비디오를 병합하고 싶습니다. Linux 컴퓨터를 실행하고 있습니다. 비디오는 mp4 형식이며 중간 품질입니다. 일부는 오디오 스트림이 누락되었습니다. 지금까지 나는 시도했다 ffmpeg, mencoder, cvlc/vlcMP4Box. 일괄 처리를 수행하고 있기 때문에 이것을 달성하기 위해 명령 줄 스크립트를 작성하고 싶습니다.

주요 문제는 내가 시도한 솔루션 중 일부는 두 개의 비디오에서 잘 작동하고 일부는 오디오 스트림이있는 비디오에서는 잘 작동하고 다른 일부는 내 비디오 세트의 다른 하위 집합에서는 잘 작동한다는 것입니다. 그러나이 작업에 대한 포괄적 인 솔루션을 찾지 못했습니다.


2
여러 SE 사이트에서 같은 질문을하지 마십시오 : superuser.com/questions/928548/…
Maythux

지금까지 시도한 내용을 구체적으로 게시 할 수 있습니까?
ohaal

1
@ohaal 나는 ffmpeg필터와 파일 프로토콜을 포함하여에 주어진 다양한 연결 방법을 사용해 보았습니다 . 의 concat기능을 사용해 보았습니다 cvlc/vlc. 나는 또한의 concat기능을 시도했다 mencoder. 이 모든 것이 부분적으로 효과가있었습니다. 이것은 마침내 문제를 해결하는 데 도움 되었습니다.
Dhruv Singal

예, 당신은 이미 도구를 언급했습니다. 내가 의미 한 것은 실제로 실행 한 명령이었습니다. 또한 미래 방문자를 위해 당신을 위해 (당신의 대답으로) 해결 한 명령을 포함시킬 수 있다면 좋을 것입니다.
ohaal

아, 당신의 요점을 참조하십시오. 불행히도, 순전히 번호로 인해 명령을 나열 할 수 없습니다. 내 문제를 해결 명령이 있었다melt {input-sequence} -consumer avformat:{output-name} acodec=libmp3lame vcodec=libx264
두식 신갈

답변:


41

mkvmerge여러 MP4 파일을 단일 파일로 결합하는 데 사용 하고 있습니다.

mkvmerge -o outfile.mkv infile_01.mp4 \+ infile_02.mp4 \+ infile_03.mp4

3
.mkv어떤 확장자를 제공하든 Matroska 컨테이너이므로 출력 파일 의 확장자를 사용하는 것이 좋습니다 .
haridsv

설치하는 방법은 다음과 같습니다 mkvmerge. tipsonubuntu.com
Morgoth

이 명령 mkvmerge 만 작동합니다. 모든 ffmpeg 파일은 최소한 오디오 이동으로 실패합니다.
42n4

25

당신은 그것을 사용하여 할 수 있습니다 ffmpeg:

ffmpeg -i concat:"input1.mp4|input2.mp4" output.mp4

참조 및 추가 정보


2
나는 그것을 시도했다. 이것의 문제는 그것이 적절하게 제공되지 않는다는 것입니다. 1. 오디오 트랙이 흐릿합니다. 2. 비디오 트랙에 약간의 장애가 있습니다.
Dhruv Singal 2016 년

나는 그것을 샘플 이상으로 사용했는데 결과는 고품질이며 아마도 소스 비디오 품질에 문제가 있습니까?
Maythux

당신 말이 맞을 것입니다. 이 문제를 해결했습니다 : askubuntu.com/a/637179/420614
Dhruv Singal

2
concat 프로토콜을 사용하여 MP4를 연결하지 마십시오. 대부분의 일반 사용자에게는없는 특정 형식에서만 작동합니다. 사용 CONCAT 디멀티플렉서 또는 CONCAT 필터 대신합니다.
llogan

나는 각각 30 분의 2 mp4 파일로 ffmpeg를 시도했습니다. 길이가 7 시간 인 출력 파일이 있습니다.
Guus


4

ffmpeg를 사용하여 코드 변환하지 않고 MP4를 연결하는 작은 쉘 스크립트를 작성했습니다.

for f in $(ls *.MP4); do
    ffmpeg -i $f -c copy -bsf:v h264_mp4toannexb -f mpegts $f.ts
done

CONCAT=$(echo $(ls *.ts) | sed -e "s/ /|/g")

ffmpeg -i "concat:$CONCAT" -c copy -bsf:a aac_adtstoasc output.mp4

rm *.ts

이것은 MPEG 컨테이너에 중간 파일을 생성 한 다음 MP4로 연결합니다.


파일 이름에 공백이 있거나 경우에 따라 특수 문자가 포함되어 있으면이 스크립트가 실패한다는 점에 유의해야합니다. 루프의 경우을 사용 for f in *.MP4하지 않고 사용 하는 것이 훨씬 좋습니다 ls. (항상 사용하지 않아야 ls중요한 몇 가지 이유로 스크립트에서, 더 나은 옵션이 있습니다.) 또한, 변수를 사용 따옴표 당신이하지 않는 특정 공백이나 기타 특수 문자, 그래서 없는지 "${f}"(또는 "$f") 대신 인용 부호로 둘러싸이지 않은가 $f.
Paddy Landau

CONCAT=$(echo $(ls *.ts) | sed -e "s/ /|/g")1, 2, 3 ... 10 ... 20 인 파일 이름에서는 제대로 작동하지 않습니다. 파일 이름을 1, 10 ... 2, 20 ... 등으로 구문 분석하면 CONCAT=$(echo $(ls -v *.ts) | sed -e "s/ /|/g")순서가 보장됩니다. .
tisaconundrum

2

다음 형식으로 연결하려는 모든 파일을 사용하여 files.txt 파일을 작성하십시오 (#으로 시작하는 행은 무시 됨).

# this is a comment
file 'file1.mp4'
file '/path/to/file2.mp4'
file 'file3.mp4'

이들은 상대 또는 절대 경로 일 수 있습니다. 그런 다음 파일을 스트리밍하거나 다시 인코딩 할 수 있습니다.

ffmpeg -f concat -safe 0 -i files.txt -c copy output.mp4

0

내 스크립트는 순전히 bashffmpeg입니다. 명령 행에 제공된 파일을 하나로 인코딩합니다.

파일의 해상도가 동일해야합니다. 다른 메타 데이터 로테이션을 허용하지만 ffmpeg concat:그렇지 않습니다.

rm ffmpeg-concat-output.mkv

FILE_COUNT=$#
INPUTS=""
FILTER=""
INDEX=0
for FNAME in $@; do
    echo "Processing ${FNAME}"
    INPUTS="${INPUTS} -i $FNAME"

    if [ -z "${FILTER}" ]; then
        FILTER="[$INDEX:v:0] [$INDEX:a:0]"
    else
        FILTER="${FILTER} [$INDEX:v:0] [$INDEX:a:0]"
    fi
    let INDEX+=1
done

COMMAND="ffmpeg ${INPUTS} \
    -filter_complex '${FILTER} \
        concat=n=${INDEX}:v=1:a=1 [v] [a]' \
    -map '[v]' -map '[a]' \
    ffmpeg-concat-output.mkv"

#   -af 'volume=15dB' # won't work with -filter_complex

bash -c "${COMMAND}"

0

moviepy를 사용하여 하위 세그먼트도 연결할 수 있는 Python 스크립트 를 만들었습니다 (예를 들어 비디오에서 일부 부분을 제거하려는 경우 유용).

함께 사용하십시오 :

vcat -i inputfile1,inputfile2[start-end],... -o <outputfile>

-1

Maythux의 대답 이외에 에서 :

몇몇 멀티미디어 컨테이너 (MPEG-1, MPEG-2 PS, DV)를 사용하면 비디오를 포함하는 파일을 연결하여 비디오를 연결할 수 있습니다.

즉, 연결할 비디오는 위에서 언급 한 비디오 컨테이너 중 하나를 사용합니다 (개인 경험을 위해 MPEG-4 Part 14를 추가 할 것입니다).

cat video1.ext video2.ext video3.ext > video4.ext

1
나는 이것을 시도했지만 첫 번째 비디오 만 출력으로 반환합니다. 나는 그것이 작동하지 않는 어딘가를 읽었지만, 이것의 근거를 기억하지는 못합니다.
Dhruv Singal 2016 년

@DhruvSingal 예, 확인할 수 있습니다. 동일한 비디오 / 오디오 인코딩으로 두 개의 MP4 비디오에서 시도했으며 첫 번째 비디오 만 탐색 할 수있었습니다. 어느 정도는 합리적으로 보이지만 몇 번의 MP4 비디오로이 작업을 한 번 완료 한 것 같습니다. 아마도 메모리가 제대로 작동하지 않거나 작동하기위한 다른 요구 사항이있을 수 있습니다. 관심이 있기 때문에 이에 대해 조사하고 싶습니다. 만약 무언가를 찾으면 답변을 업데이트하고 의견을
남겨

우리는 어떻게 든 첫 번째 비디오의 시작 부분에서 결합 된 영화의 전체 길이를 포괄하도록 메타 데이터를 변경해야합니다. mpeg4 파일 몇 개만으로 메타 데이터를 볼 수 있습니다.
Ken Mollerup
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.