품질 손실없이 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.