* .Ts dosyalarını tek bir mp4'te birleştirmek için ffmpeg copy codec bileşenini kullanın


47

Tek bir index.m3u8 dosyası tarafından açıklanan bir sürü ts parçası var:

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

Hepsinin aynı şekilde kodlandığını biliyorum. ffprobe bana aşağıdakileri veriyor:

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)

Onları tek bir mp4 kabında birleştirmek istiyorum. Ama şöyle komutları denediğimde:

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

index.m3u8 dosyasından filelist.txt dosyasını oluştururken, çeşitli dosyaları okuyamayacağından şikayetçi olur. Ancak ts dosyalarının dönüştürülmesi de iyi sonuç veriyor. Sanırım ffmpeg'i düzgün kullanmıyorum.

Ffmpeg komutunu index.m3u8 tarafından açıklanan ts dosyalarını kopya kod çözücüyü kullanarak tek bir mp4 kabında birleştirmek için nasıl kullanırım?

Yanıtlar:


58

Ffmpeg'in neden size bir hata verdiğinden emin değilim. Ancak ts, basitçe birleştirilebilecek birkaç formattan biridir. Daha sonra, tek bir ts'nuz olduğunda, mp4'e dönüştürün.

Pencerelerin altında:

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 altında bash kullanarak:

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
Ayrıca gerekebilir -bsf:a aac_adtstoasc.
Camilo Martin

1
komutun DEĞİL olduğunu not etmek ilginçtir ffmpeg copy ..., copy ...(Windows altında)
Ron Royston

25

Szatmary'nin şu anki en iyi cevabı gibi dosyaları birleştirmek için kopya ya da kedinin kullanılması, sizi sınırın çok ötesinde oynayan ve oynatma sorunları ile birlikte arayamayan bir dosyaya bırakabilir.

Bunun yerine, bu dosyaları düzgün bir şekilde birleştirmek için https://trac.ffmpeg.org/wiki/Concatenate . (Eğer zaten yoksa https://github.com/adaptlearning/adapt_authoring/wiki/Installing-FFmpeg .

İlk bağlantımı okuyamayacak kadar tembelseniz, temelde birleştirmek istediğiniz tüm dosyaları (. birleştirme yapıyoruz:

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

İşte, örneğin komut satırında Windows kullanıyorsanız, ancak dosyayı el ile veya istediğiniz şekilde yapabilirseniz, bir metin dosyası oluşturma yolumdaki ilk bağlantımdan bir kopya yapıştırması:

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

.Txt dosyanızın iyi göründüğünden ve doğru formatlandığından emin olun!

Bundan sonra komut satırında çalıştırma:

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

'mylist.txt', az önce yaptığınız .txt dosyasıdır.

Elde edilen dosyanın videonun doğru oynatılıp oynatılmadığını kontrol edin. Buradan isterseniz, mp4'e her zamanki gibi transmux yapabilirsiniz:

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

Bu for %i in (*.ts) do, i> = 10 için doğru sıralanmıyor. Bunun dışında, her şey çalışıyor, teşekkürler. Aslında, birleştirilmiş dosyada sorun vardı, yönteminizi kullanarak yapılan dosyanın% 16 daha küçük olduğu söylenmedi (400kb ile 1400 bölüme sahiptim).
kullanıcı

Sayılar için @user sırayla gibi sayılar arasında yineleyebilirsinizfor i in {1..10}; do echo file \'$i.ts\' >> list.txt ; done
qwr

8

2017 cevabı

Ama ben böyle komutları denediğimde ..., çeşitli dosyaları okuyamamaktan şikayet ediyor.

Ben yürütmek zaman ffmpeg -i some.ts -c copy some.mp4belli videoda, bu hata mesajını alıyorum:

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

Beklendiği gibi, yürütme ffmpeg -i some.ts -c copy -bsf:a aac_adtstoasc some.mp4onu düzeltir.


3
Yeterince yeni bir şey edinin ffmpegve şimdi otomatik olarak bunu yapacak.
lgagan

7

Hepsini bir araya getirmek

Juan Aquino'nun cevabını kullanarak (ve Bash ile uyumlu olması için ilk komutu düzelterek ve dosyaların sıralamasını kullanarak) ve 7vujy0f0hy'nin cevabını kullanarak Linux Bash kabuğu için basit bir çalışma komut dosyası:

#!/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 oynatma listesindeki birden fazla video dosyasını birleştirmenin doğru yolu

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


  • m3u8 çalma listesi web'de veya yerel olarak dizinde olabilir
    • çalma listesine göre dosya yollarının listesini içerir
  • -codec copy kodlamayı önlemek için
  • konteyner tipi konular:
    • *.mp4 gayet iyi, ancak oynatma listesi web'den alındığında sıkmak biraz yavaş görünüyor
    • *.mkvveya *.tsbenim için en iyi çalıştı

2

Birleştirme işlemini basitçe (bash ile) yapabilirsiniz:

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

<number>En yüksek sayı ile değiştirin (açıkçası). Ffmpeg'li değişkenler düzgün çalışmadı. Çıkış video dosyası garip bir şekilde kekemelik yapardı.

Dosyaların doğru sırasını sağlamak için for döngüsünü kullanırım. Belki ihtiyacın yoktur. Belki de çıkışı ffmpeg'a bağlamak ve anında mp4'e dönüştürmek bile mümkün.


0

Ffmpeg'i çalıştırmadan önce TS dosyalarını birleştirmek için okuyucuları yanlış yönlendiren tüm bu popüler cevaplar yanlıştır. Ses ve videonun mp4 akışının montajı sırasında senkronizasyondan düşmemesini sağlamak için ffmpeg'in zayıf belgelenmiş ancak önemli "-f concat" özelliği kullanılmalıdır.

    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

İki hazırlayıcı kod satırı, sadece bu satır biçiminde TS dosyalarının bir listesini içeren bir dosya oluşturur:

    file 'seg-37-a.ts'

Aslında, bunu denediğimde, final videodaki segmentler arasında hafif bir "kekeme" vardı. Bu yüzden en azından bir durumda önce TS dosyalarının birleştirilmesine yardımcı oldu.
Sphinxxx

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.