Gunakan ffmpeg copy codec untuk menggabungkan file * .t ke dalam satu mp4

35

Saya punya banyak segmen yang dijelaskan oleh satu file index.m3u8:

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

Saya tahu mereka semua dikodekan dengan cara yang sama. ffprobe memberi saya yang berikut:

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)

Saya ingin menggabungkan mereka ke dalam wadah mp4 tunggal. Tetapi ketika saya mencoba perintah seperti:

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

di mana menghasilkan filelist.txt dari file index.m3u8, ia mengeluh tidak bisa membaca berbagai file. Tetapi mengonversi file ts sendiri tampaknya berfungsi dengan baik. Saya pikir saya tidak menggunakan ffmpeg dengan benar.

Bagaimana cara menggunakan ffmpeg untuk menggabungkan file ts yang dijelaskan oleh index.m3u8 ke dalam wadah mp4 tunggal menggunakan copy codec?

Ana
sumber

Jawaban:

48

Saya tidak yakin mengapa ffmpeg memberi Anda kesalahan. Namun ts adalah salah satu dari beberapa format yang dapat digabungkan. Kemudian, setelah Anda memiliki satu ts, transmux ke mp4.

Di bawah jendela:

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

Di bawah GNU / Linux, menggunakan 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
szatmary
sumber
12
Anda mungkin juga perlu -bsf:a aac_adtstoasc.
Camilo Martin
1
menarik untuk dicatat bahwa perintahnya TIDAK ffmpeg copy ..., ini copy ... (di bawah Windows)
Ron Royston
19

Menggunakan salin atau kucing untuk menggabungkan file seperti jawaban teratas szatmary saat ini mungkin meninggalkan Anda dengan file yang jauh melampaui batas dan tidak dapat mencari bersama dengan masalah pemutaran.

Sebagai gantinya, untuk menggabungkan file-file ini dengan benar, gunakan ffmpeg seperti yang diperintahkan https://trac.ffmpeg.org/wiki/Concatenate . (Instal ffmpeg di sini jika Anda belum memilikinya https://github.com/adaptlearning/adapt_authoring/wiki/Installing-FFmpeg .)

Jika Anda terlalu malas untuk membaca tautan pertama saya, pada dasarnya Anda harus membuat file .txt yang mencantumkan semua file yang ingin Anda gabungkan seperti itu (yang mana tautan pertama saya memberikan petunjuk tentang cara melakukannya dengan mudah) di folder tempat Anda sedang melakukan penyatuan:

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

Berikut adalah salinan dari tautan pertama saya pada satu cara untuk membuat file teks jika Anda memiliki Windows pada commandline misalnya tetapi jelas Anda dapat membuat file secara manual atau apa pun yang Anda inginkan:

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

Periksa kembali apakah file .txt Anda terlihat bagus dan diformat dengan benar!

Setelah ini, pada baris perintah jalankan:

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

di mana 'mylist.txt' adalah file .txt yang baru saja Anda buat.

Periksa apakah file yang dihasilkan memutar video dengan benar. Dari sini, Anda dapat mentransmisikan ke mp4 seperti biasa jika Anda suka:

ffmpeg -i all.ts -acodec copy -vcodec copy all.mp4
Juan Aquino
sumber
6

2017 jawaban

Tetapi ketika saya mencoba perintah suka ..., itu mengeluh tentang tidak bisa   untuk membaca berbagai file.

Ketika saya mengeksekusi ffmpeg -i some.ts -c copy some.mp4 pada video tertentu, saya mendapatkan pesan kesalahan ini:

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

Tidak mengherankan, mengeksekusi ffmpeg -i some.ts -c copy -bsf:a aac_adtstoasc some.mp4 memperbaikinya.

7vujy0f0hy
sumber
3
Dapatkan yang cukup baru ffmpeg dan sekarang akan melakukan ini secara otomatis.
llogan
3

Menyatukan semua

Menggunakan jawaban Juan Aquino (dan mengoreksi perintah pertama agar kompatibel dengan Bash dan menggunakan pemesanan file secara alami), ditambah jawaban 7vujy0f0hy, skrip kerja sederhana untuk shell Bash Linux adalah:

#!/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
Francesco Galgani
sumber
2

Anda dapat melakukan penggabungan sederhana seperti (dengan bash):

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

Menggantikan <number> dengan angka tertinggi (jelas). Varian dengan ffmpeg tidak berfungsi dengan baik. File video output akan gagap aneh.

Saya menggunakan for loop untuk memastikan urutan file yang benar. Mungkin Anda tidak membutuhkannya. Mungkin bahkan mungkin untuk menyalurkan output ke ffmpeg dan mengonversinya menjadi mp4 dengan cepat.

ragnarsson
sumber
0

Cara yang benar untuk menggabungkan beberapa file video dari daftar putar m3u8 adalah

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


  • daftar putar m3u8 dapat di web atau secara lokal di direktori
    • ini berisi daftar jalur file relatif terhadap daftar putar
  • -codec copy untuk menghindari pengkodean
  • jenis kontainer penting:
    • *.mp4 baik-baik saja tetapi tampaknya agak lambat untuk mux ketika playlist diambil dari web
    • *.mkv atau *.ts bekerja paling baik untuk saya
Vlastimil Ovčáčík
sumber
0

Semua jawaban populer untuk pertanyaan ini yang menyesatkan pembaca untuk menggabungkan file TS sebelum menjalankan ffmpeg salah. Untuk memastikan audio dan video tidak tidak sinkron selama perakitan aliran mp4, fitur "-f concat" ffmpeg yang penting harus digunakan.

    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

Dua baris kode persiapan hanya membuat file yang berisi daftar file TS dalam format baris ini:

    file 'seg-37-a.ts'
Douglas Daseeco
sumber