ffmpeg copy 코덱을 사용하여 * .ts 파일을 단일 mp4로 결합


47

단일 index.m3u8 파일로 설명 된 ts 세그먼트가 있습니다.

index.m3u8        
segment1_0_av.ts  
segment2_0_av.ts  
segment3_0_av.ts  
segment4_0_av.ts  
segment5_0_av.ts

나는 그것들이 모두 같은 방식으로 인코딩되어 있다는 것을 안다. ffprobe는 다음을 제공합니다.

Input #0, mpegts, from 'segment1_0_av.ts':
  Duration: 00:00:10.00, start: 0.100511, bitrate: 1251 kb/s
  Program 1 
    Stream #0:0[0x100]: Video: h264 (Main) ([27][0][0][0] / 0x001B), yuv420p, 960x540 [SAR 1:1 DAR 16:9], 12.50 fps, 25 tbr, 90k tbn, 25 tbc
    Stream #0:1[0x101]: Audio: aac ([15][0][0][0] / 0x000F), 44100 Hz, stereo, fltp, 105 kb/s
    Stream #0:2[0x102]: Unknown: none ([21][0][0][0] / 0x0015)

하나의 mp4 컨테이너로 결합하고 싶습니다. 그러나 내가 다음과 같은 명령을 시도하면 :

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

index.m3u8 파일에서 filelist.txt를 생성하면 다양한 파일을 읽을 수 없다는 불만이 있습니다. 그러나 ts 파일 변환 자체는 정상적으로 작동하는 것 같습니다. ffmpeg를 올바르게 사용하지 않는 것 같습니다.

ffmpeg를 사용하여 index.m3u8에서 설명한 ts 파일을 복사 코덱을 사용하여 단일 mp4 컨테이너로 결합하는 방법은 무엇입니까?

답변:


58

ffmpeg에서 왜 오류가 발생했는지 잘 모르겠습니다. 그러나 ts는 간단히 연결할 수있는 몇 안되는 형식 중 하나입니다. 그런 다음 단일 ts가 있으면 mp4로 변환하십시오.

창에서 :

copy /b segment1_0_av.ts+segment2_0_av.ts+segment3_0_av.ts all.ts
ffmpeg -i all.ts -acodec copy -vcodec copy all.mp4

GNU / Linux에서 bash를 사용하십시오.

cat segment1_0_av.ts segment2_0_av.ts segment3_0_av.ts > all.ts
ffmpeg -i all.ts -acodec copy -vcodec copy all.mp4

12
당신은 또한 필요할 수 있습니다 -bsf:a aac_adtstoasc.
Camilo Martin

1
명령이 아님을주의하는 것이 흥미 ffmpeg copy ..., 그것은이다 copy ...(Windows에서)
론 로이스 톤

25

복사 또는 고양이를 사용하여 szatmary의 현재 최고 답변과 같은 파일을 결합하면 한계를 훨씬 초과하여 재생 문제와 함께 찾을 수없는 파일이 남을 수 있습니다.

대신 이러한 파일을 올바르게 결합하려면 https://trac.ffmpeg.org/wiki/Concatenate에 지시 된대로 ffmpeg를 사용 하십시오 . https://github.com/adaptlearning/adapt_authoring/wiki/Installing-FFmpeg 이없는 경우 여기에 ffmpeg를 설치 하십시오 .

첫 번째 링크를 읽기가 너무 게으른 경우 기본적으로 결합하려는 모든 파일을 나열하는 .txt 파일을 만들어야합니다 (첫 번째 링크는 쉽게 수행하는 방법에 대한 지침을 제공합니다) 연결을 다시 수행하십시오.

file '/path/to/file1'
file '/path/to/file2'
file '/path/to/file3'

예를 들어 명령 줄에 Windows가 있지만 파일을 수동으로 만들 수도 있지만 원하는 경우 텍스트 파일을 만드는 한 가지 방법으로 첫 번째 링크의 복사 붙여 넣기가 있습니다.

(for %i in (*.ts) do @echo file '%i') > mylist.txt

.txt 파일이 좋아 보이고 올바른 형식인지 다시 확인하십시오!

그런 다음 명령 줄에서 다음을 실행하십시오.

ffmpeg -f concat -i mylist.txt -c copy all.ts

여기서 'mylist.txt'는 방금 만든 .txt 파일입니다.

결과 파일이 비디오를 올바르게 재생하는지 확인하십시오. 여기에서 원하는 경우 평소와 같이 mp4로 변환 할 수 있습니다.

ffmpeg -i all.ts -acodec copy -vcodec copy all.mp4

for %i in (*.ts) do와는 별개로 난> = 10, 모든 작품, 감사에 대해 올바르게 정렬하지 않습니다. 실제로 연결된 파일에 문제가 있었지만 메서드를 사용하여 만든 파일의 크기가 16 % 작다는 사실은 말할 것도 없습니다 (1400 개 x 400kb).
사용자

quser for i in {1..10}; do echo file \'$i.ts\' >> list.txt ; done
qwr

8

2017 년 답변

그러나와 같은 명령을 시도하면 ...다양한 파일을 읽을 수 없다는 불만이 있습니다.

ffmpeg -i some.ts -c copy some.mp4특정 비디오에서 실행할 때이 오류 메시지가 나타납니다.

Malformed AAC bitstream detected: use the audio bitstream filter 
'aac_adtstoasc' to fix it ('-bsf:a aac_adtstoasc' option with ffmpeg)

av_interleaved_write_frame(): Operation not permitted

당연히 실행 ffmpeg -i some.ts -c copy -bsf:a aac_adtstoasc some.mp4하면 문제가 해결됩니다.


3
충분히 새로운 ffmpeg것을 얻으면 이제 자동 으로이 작업을 수행합니다.
llogan

7

모두 모아

Juan Aquino의 답변 (및 Bash와 호환되고 첫 번째 파일 순서를 사용하도록 첫 번째 명령 수정)과 7vujy0f0hy의 답변을 사용하여 Linux Bash 쉘의 간단한 작업 스크립트는 다음과 같습니다.

#!/bin/bash
for i in `ls *.ts | sort -V`; do echo "file $i"; done >> mylist.txt
ffmpeg -f concat -i mylist.txt -c copy -bsf:a aac_adtstoasc video.mp4

4

m3u8 재생 목록에서 여러 비디오 파일을 연결하는 올바른 방법은

ffmpeg -i "index.m3u8" -codec copy output.mp4


  • m3u8 재생 목록은 웹 또는 로컬 디렉토리에있을 수 있습니다.
    • 재생 목록과 관련된 파일 경로 목록이 포함되어 있습니다.
  • -codec copy 인코딩을 피하기 위해
  • 컨테이너 유형 문제 :
    • *.mp4 괜찮지 만 재생 목록을 웹에서 가져올 때 mux 속도가 약간 느려 보입니다.
    • *.mkv또는 *.ts나를 위해 최선을 다했다

2

연결을 간단하게 할 수 있습니다 (bash).

for f in ./{0..<number>}.ts; do cat $f >> out.ts; done

<number>가장 높은 숫자로 교체하십시오 (분명히). ffmpeg가있는 변종이 제대로 작동하지 않았습니다. 출력 비디오 파일이 이상하게 들립니다.

파일의 올바른 순서를 보장하기 위해 for 루프를 사용합니다. 어쩌면 필요하지 않을 수도 있습니다. 출력을 ffmpeg로 파이프하고 mp4로 즉시 변환하는 것이 가능할 수도 있습니다.


0

ffmpeg를 실행하기 전에 TS 파일을 연결하도록 리더를 오도하는이 질문에 대한 모든 대중적인 대답이 올바르지 않습니다. mp4 스트림을 조립하는 동안 오디오와 비디오가 동기화되지 않도록하려면 ffmpeg의 문서화되지 않았지만 중요한 "-f concat"기능을 사용해야합니다.

    delimiterBeforeFileNumber="-"
    ls |egrep '[.]ts$' \
        |sort "-t$delimiterBeforeFileNumber" -k2,2n \
        |sed -r "s/(.*)/file '\1'/" >ts.files.txt

    ffmpeg -f concat -i ts.files.txt -c copy tsw.014.ts.mp4

두 개의 준비 코드 줄은이 줄 형식으로 TS 파일 목록을 포함하는 파일을 만듭니다.

    file 'seg-37-a.ts'

실제로이 작업을 시도했을 때 최종 비디오의 세그먼트 사이에 약간의 "더듬 거림"이있었습니다. 따라서 적어도 그 경우에는 TS 파일을 먼저 연결하는 데 도움이되었습니다.
Sphinxxx

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