품질 손실없이 ffmpeg로 두 개의 mp4 파일 연결


16

ffmpeg를 사용하여 2 개의 비디오를 연결하고 싶습니다. 나는 사용하고있다 :

ffmpeg -i output1.mp4 -scodec copy -vbsf h264_mp4toannexb i0.ts

그러나 mp4 파일은 소스 파일보다 훨씬 나빠 보입니다.

두 파일에 대한 정보는 다음과 같습니다.

   Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'output1.mp4':
   Metadata:
   major_brand     : isom
   minor_version   : 1
   compatible_brands: isom
   creation_time   : 2013-06-13 15:40:36
   Duration: 00:00:15.72, start: 0.000000, bitrate: 2053 kb/s
   Stream #0.0(und): Video: h264 (High), yuv420p, 1280x720, 1931 kb/s, 25 fps, 25 tbr,   12800 tbn, 50 tbc
   Stream #0.1(und): Audio: aac, 44100 Hz, stereo, s16, 128 kb/s

  Input #0, mpegts, from 'i0.ts':
  Duration: 00:00:15.64, start: 1.400000, bitrate: 1382 kb/s
  Program 1 
  Metadata:
  service_name    : Service01
  service_provider: Libav
  Stream #0.0[0x100]: Video: mpeg2video (Main), yuv420p, 1280x720 [PAR 1:1 DAR 16:9], 104857 kb/s, 25 fps, 25 tbr, 90k tbn, 50 tbc
  Stream #0.1[0x101](und): Audio: mp2, 44100 Hz, stereo, s16, 128 kb/s

이 문제를 어떻게 해결할 수 있습니까?


정확히 무엇을하려고합니까? "concat"이라는 용어는 여러 파일을 조인하는 것을 의미하지만 하나의 입력 output1.mp4과 하나의 출력 만 참조합니다 i0.ts. ts 출력 컨테이너로 인코딩하면 mpeg2video기본적으로 인코더 가 사용되며 (적어도 빌드에서는)이 인코더의 기본 비트 전송률 또는 품질 설정을 마지막으로 확인했을 때 -b:v 200k대부분의 경우 너무 낮습니다.
— llogan

죄송합니다. 그런 다음 ffmpeg -i "concat : i0.ts | i1.ts"output1111.mp4로 연결합니다. 그러나 문제는 내가 ts 파일을 만들 때 이미 품질이 나쁘다는 것입니다.

MPEG-2 비디오로 다시 인코딩하지 않아도됩니다. 모든 원본 입력 ( output1.mp4등)의 형식, 프레임 속도 및 프레임 크기가 동일합니까?
— llogan

그렇습니다. 모두 동일합니다

답변:


36

concat디 먹서 사용을 고려하십시오 . 이렇게하면 일시적인 손실 중간 파일을 만들지 않고 추가 인코딩 단계를 건너 뛸 수 있습니다.

참고 : 모든 입력은 동일한 스트림 유형 (같은 형식, 동일한 시간 기준 등)을 가져야합니다.

  1. 텍스트 파일을 작성하고 연결할 각 파일의 경로와 이름을 포함하십시오 (또는 "결합"). 예제 파일 input.txt:

    file '/home/jenia/input1.mp4'
    file '/home/jenia/input2.mp4'
    file '/home/jenia/input3.mp4'
    
  2. 이제 concat디먹 서를 사용할 수 있습니다 :

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

이 기능이 없으면 ffmpeg가 너무 오래되었거나 libav 포크에서 "가짜"ffmpeg를 사용하고있는 것입니다.

FFmpeg 다운로드 페이지 를 통해 Linux, OS X 및 Windows에서 사용하기 쉬운 정적 빌드를 사용 하거나 단계별 지침에 따라 ffmpeg를 컴파일 할 수 있습니다 .

참조 :


이것은 내가 원했던 것이므로 iPhone 6에서 2 .mov 파일을 병합하는 데 도움이되었습니다. 감사합니다.
— Ryan

7

가장 빠른 1- 라이너는 다음과 같습니다.

ls Movie\ Part\ * | while read line; do echo file \'$line\'; done | ffmpeg -f concat -i - -c copy output.mp4

Windows 명령 줄에 이러한 1-onliner을 얻을 수 있습니까?
— PeterCo

2
리눅스에서는이 oneliner를 사용했습니다 : ffmpeg -safe 0 -f concat -i <(find . -type f -name '*' -printf "file '$PWD/%p'\n" | sort) -c copy output.mkv(mkv는 mp4보다 많은 코덱을 허용하지만 mp4로 시도 할 수도 있습니다). 는 -safe 0불평 최근는 FFmpeg 버전입니다 안전하지 않은 파일 이름 , 그리고이 -type f파일 만 나열입니다. | sort파일을 사전 순으로 정렬하기 위해 추가 했습니다. 때문에이 find파일 시스템에 저장된으로 순서대로 읽습니다. 공백이있는 파일에도 작동합니다.
— 에릭
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.