두 개의 비디오를 연결할 때 다른 비디오에서 오디오가 사라짐


0

나는이 개 MP4 파일을 CONCAT 싶어 header.mp4하고 body.mp4. 그리고 나는 아래 명령을 사용합니다.

ffmpeg -i header.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts intermediate1.ts
ffmpeg -i body.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts intermediate2.ts

그런 다음 연결합니다.

ffmpeg -i "concat:intermediate1.ts|intermediate2.ts" -c copy -bsf:a aac_adtstoasc output.mp4

출력 파일은 올바른 지속 시간을 갖지만 오디오의 오디오 body.mp4는 그대로 유지 body.mp4됩니다 output.mp4.

-c copy세 번째 명령에서 제거하면 올바른 결과가 나오지만 시간이 너무 오래 걸립니다. 뭐가 문제 야?

편집하다

ffmpeg -i header.mp4:

ffmpeg version 3.4.2 Copyright (c) 2000-2018 the FFmpeg developers
        built with Apple LLVM version 9.0.0 (clang-900.0.37)
configuration: --prefix=/usr/local/Cellar/ffmpeg/3.4.2 --enable-shared --enable-pthreads --enable-version3 --enable-hardcoded-tables --enable-avresample --cc=clang --host-cflags= --host-ldflags= --disable-jack --enable-gpl --enable-libass --enable-libfdk-aac --enable-libfontconfig --enable-libfreetype --enable-libmp3lame --enable-libopus --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libx265 --enable-libxvid --enable-opencl --enable-videotoolbox --disable-lzma --enable-nonfree
        libavutil      55. 78.100 / 55. 78.100
libavcodec     57.107.100 / 57.107.100
libavformat    57. 83.100 / 57. 83.100
libavdevice    57. 10.100 / 57. 10.100
libavfilter     6.107.100 /  6.107.100
libavresample   3.  7.  0 /  3.  7.  0
libswscale      4.  8.100 /  4.  8.100
libswresample   2.  9.100 /  2.  9.100
libpostproc    54.  7.100 / 54.  7.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'header.mp4':
Metadata:
        major_brand     : isom
        minor_version   : 512
compatible_brands: isomiso2avc1mp41
encoder         : Lavf57.52.100
Duration: 00:00:04.04, start: 0.000000, bitrate: 644 kb/s
        Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709), 1280x720 [SAR 1:1 DAR 16:9], 632 kb/s, 29.97 fps, 29.97 tbr, 30k tbn, 50 tbc (default)
Metadata:
        handler_name    : VideoHandler
        Stream #0:1(zho): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 2 kb/s (default)
Metadata:
        handler_name    : SoundHandler

그리고 ffmpeg -i body.mp4

ffmpeg version 3.4.2 Copyright (c) 2000-2018 the FFmpeg developers
        built with Apple LLVM version 9.0.0 (clang-900.0.37)
configuration: --prefix=/usr/local/Cellar/ffmpeg/3.4.2 --enable-shared --enable-pthreads --enable-version3 --enable-hardcoded-tables --enable-avresample --cc=clang --host-cflags= --host-ldflags= --disable-jack --enable-gpl --enable-libass --enable-libfdk-aac --enable-libfontconfig --enable-libfreetype --enable-libmp3lame --enable-libopus --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libx265 --enable-libxvid --enable-opencl --enable-videotoolbox --disable-lzma --enable-nonfree
        libavutil      55. 78.100 / 55. 78.100
libavcodec     57.107.100 / 57.107.100
libavformat    57. 83.100 / 57. 83.100
libavdevice    57. 10.100 / 57. 10.100
libavfilter     6.107.100 /  6.107.100
libavresample   3.  7.  0 /  3.  7.  0
libswscale      4.  8.100 /  4.  8.100
libswresample   2.  9.100 /  2.  9.100
libpostproc    54.  7.100 / 54.  7.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'body.mp4':
Metadata:
        major_brand     : mp42
        minor_version   : 0
compatible_brands: isommp42
creation_time   : 2017-03-01T09:47:27.000000Z
Duration: 00:01:33.14, start: 0.000000, bitrate: 241 kb/s
        Stream #0:0(und): Video: h264 (Main) (avc1 / 0x31637661), yuv420p(tv, bt709), 1280x720 [SAR 1:1 DAR 16:9], 112 kb/s, 24 fps, 24 tbr, 90k tbn, 48 tbc (default)
Metadata:
        creation_time   : 2017-03-01T09:47:27.000000Z
handler_name    : ISO Media file produced by Google Inc.
Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 125 kb/s (default)
Metadata:
        creation_time   : 2017-03-01T09:47:27.000000Z
handler_name    : ISO Media file produced by Google Inc.

1
전체의 출력 표시 ffmpeg -i header.mp4ffmpeg -i body.mp4
llogan

첫 번째와 두 번째 명령을 의미합니까?
LiJianixn

두 명령의 전체 출력을 표시 할 수도 있습니다 (예).
slhck

1
@LiJianixn 난 그냥 의미 ffmpeg -i header.mp4ffmpeg -i body.mp4(또는 ffmpeg -i header.mp4 -i body.mp4당신이 좋아하지만, 모두 잊지 않도록해야합니다 경우 -i옵션). 입력 및에 대한 필수 정보가 표시됩니다 ffmpeg. 이 요청은 종종 사용자를 혼란스럽게합니다. 첫 번째와 두 번째 명령의 출력도 충분하지만 출력이 훨씬 길고 추가 정보가 필요하지 않습니다.
llogan

@LordNeckbeard 질문을 편집했습니다.
LiJianixn

답변:


1

문제

입력을 연결하려면 형식과 매개 변수가 같아야합니다. 귀하의 경우 비디오의 프레임 속도가 다르고 오디오의 샘플 속도가 다릅니다.

솔루션

다음 중 하나를 수행 할 수 있습니다.

  • 다른 입력과 일치하도록 입력 중 하나를 다시 인코딩 한 다음 concat demuxer 를 사용하십시오 . 또는
  • 일부 필터를 사용하여 차이점을 수정 한 다음 하나의 명령으로 concat 필터를 사용하여 연결하십시오 .
  • 디 먹서 또는 필터가 일반적으로 대부분의 사용자에게 더 나은 선택이므로 concat 프로토콜 을 사용하는 것은 거의 권장하지 않습니다 .

Concat Demxer

장점은 둘 다 대신 하나의 비디오 만 다시 인코딩되며 concat 필터를 사용하는 것보다 프로세스가 더 빠를 수 있다는 것입니다.

일치하기 header.mp4body.mp4처음으로 다시 인코딩 header.mp4:

ffmpeg -i header.mp4 -r 24 -ar 44100 -profile:v main -video_track_timescale 90k header_2.mp4

input.txt연결하려는 파일 이름이 포함 된 텍스트 파일 (예 :)을 만듭니다 .

file header_2.mp4
file body.mp4

마지막으로 concat demuxer를 사용하십시오.

ffmpeg -f concat -i input.txt -c copy output.mp4

연결 필터

장점은 여러 이종 소스를 연결하려는 경우 필터 체인이 적절한 필터를 사용한다고 가정 할 때 모두 동일한 명령 옵션을 사용할 수 있다는 것입니다.

ffmpeg -i header.mp4 -i body.mp4 -filter_complex "[0:v]fps=24[v0];[v0][0:a][1:v][1:a]concat=n=2:v=1:a=1[v][a]" -map "[v]" -map "[a]" output.mp4

concat 필터는 비디오 스트림에 대한 공통 픽셀 형식과 오디오 스트림에 대한 공통 샘플 형식, 샘플 속도 및 채널 레이아웃을 자동으로 선택하므로이를 처리 할 필요가없는 경우에는 처리 할 필요가 없습니다. 그렇지 않으면 더 많은 필터를 추가하십시오.

더 많은 정보


설명 할 수 있습니까 ffmpeg -i header.mp4 -r 24 -ar 44100 -profile:v main header_2.mp4?
LiJianixn

@LiJianixn이 옵션은 다른 header.mp4매개 변수를에 일치시킵니다 body.mp4. -r프레임 속도를 변경합니다. header.mp430000/1001 (일명 "29.97"), body.mp424입니다. -ar오디오 샘플 속도를 변경합니다 . header.mp448000, body.mp444100입니다 -profile:v. H264 프로파일을 수동으로 선택합니다. : header.mp4하이 프로파일, body.mp4메인 프로파일입니다.
llogan

concat demxer나를 위해 작동하지 않습니다.
LiJianixn

지속 시간 output.mp4은 11:52입니다.
LiJianixn

@LiJianixn 추가 정보가 없으면 아무 것도 제안 할 수 없습니다. 각 입력 파일에 대한 정보를 표시하십시오 ffmpeg -i input1 -i input2. 페이스트 빈 사이트를 사용하고 주석에 링크를 제공 할 수 있습니다.
llogan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.