복잡한 필터를 사용하여 ffmpeg 다시 인코딩 피하기


2

나중에 트림되고 mp4로 인코딩되도록 연결되는 ts 파일 목록이 있습니다.

모든 것이 정상적으로 작동하지만 ... 지금 당장 문제는 파일이 다시 인코딩된다는 것입니다 .TS는 이미 h264와 mp3이므로 mp4로 포장하기 때문에 원하는 것은 아닙니다. 승인. 실제로 이것은 작동합니다.

ffmpeg -i file.ts -c copy file.mp4

그러나 이것은 아닙니다 :

ffmpeg -i videohls-1935m-index.ts -y -filter_complex \
[0:v]trim=0:10,setpts=PTS-STARTPTS[v0]; \
[0:a]atrim=0:10,asetpts=PTS-STARTPTS[a0]; \
[0:v]trim=30:90,setpts=PTS-STARTPTS[v1]; \
[0:a]atrim=30:90,asetpts=PTS-STARTPTS[a1]; \
[0:v]trim=100:200,setpts=PTS-STARTPTS[v2]; \
[0:a]atrim=100:200,asetpts=PTS-STARTPTS[a2]; \
[0:v]trim=250:350,setpts=PTS-STARTPTS[v3]; \
[0:a]atrim=250:350,asetpts=PTS-STARTPTS[a3]; \
[v0][a0][v1][a1][v2][a2][v3][a3]concat=n=4:v=1:a=1[out] \
-map [out] \
-c copy \
videohls-1935m-index.mp4

출력이 [out]에 매핑 된 가상 엑시트에서 나오기 때문에 코덱을 "복사"하지 않을 것입니다. 이므로 한 말에 "코덱"이 없으므로 복사 할 수 없습니다.

이것은 두 가지 문제가 있음을 의미합니다.

  1. 파일이 더 작아서 전혀 나쁘지는 않지만 ...
  2. 파일이 다시 인코딩되어 품질이 떨어집니다.

비디오 품질을 유지하기 위해 이것을 피하려면 어떻게해야합니까?


비디오 필터는 압축되지 않은 원시 프레임에서 작동하므로 필터로 처리하기 전에 디코딩 한 후 인코딩해야합니다. "copy"코덱을 사용하면 실제로이 스트림에 대한 필터가 비활성화됩니다 ( ffmpeg.org/ffmpeg-all.html#Stream-copy 참조) .
SirDarius

빠른 답변을 주셔서 감사합니다 ... 질문 : 그럼 내가 더 빨리 할 수있는 방법이 없습니까? 간단하고 빠르게 유지하고 싶습니다. 먼저 파일을 만든 다음 연결하여 수행 할 수 있습니다. 이것이이 방법보다 낫다고 생각합니까?
AbrahamSustaita

2
ffmpeg클리닉 사용에 대한 추가 질문이있는 경우 슈퍼 유저 에게 문의해야합니다 . 스택 오버플로는 특히 프로그래밍 질문에만 해당됩니다. 이 질문이 마이그레이션 된 것이 가장 좋습니다.
llogan

어떻게 마이그레이션 할 수 있습니까?
AbrahamSustaita

2
플래그 링크를 클릭하고 중재자의 관심을 요청할 수 있습니다.
llogan

답변:


2

필터링에는 다시 인코딩이 필요 하지만 다른 옵션이 있습니다.

1. 각 세그먼트를 만드십시오

당신이 대신 할 수있는 것은 스트림을 복사 하여 각 세그먼트를 -ss하고 -t-to-c copy.

  • 처음 10 초를 건너 뛰고 20 초 출력하는 예 :

    ffmpeg -ss 10 -i input -t 20 -c copy output
    
  • 처음 10 초를 건너 뛰고 지속 시간 30에서 정지하여 20 초 출력되는 예 :

    ffmpeg -i input -ss 10 -to 30 -c copy output
    

2. 연결

  1. 먼저 concat demuxer documentation을 읽으십시오 .

  2. 그런 다음 목록 파일을 만드십시오.

    $ cat inputs.txt
    file '/path/to/segment00.mp4'
    file '/path/to/segment01.mp4'
    file '/path/to/segment02.mp4'
    file '/path/to/segment03.mp4'
    
  3. 마지막으로 다음을 연결할 수 있습니다.

    ffmpeg -f concat -i inputs.txt -c copy output
    

참조


당신은 또한 사용할 수 먹서을 세그먼트를 생성 할 수 있습니다. segment
slhck

답변으로 추가해 주시겠습니까?
AbrahamSustaita
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.