Mam kilka segmentów ts opisanych w jednym pliku index.m3u8:
index.m3u8
segment1_0_av.ts
segment2_0_av.ts
segment3_0_av.ts
segment4_0_av.ts
segment5_0_av.ts
Wiem, że wszystkie są kodowane w ten sam sposób. ffprobe daje mi następujące informacje:
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)
Chciałbym połączyć je w jeden pojemnik MP4. Ale kiedy próbuję poleceń takich jak:
ffmpeg -f concat -i filelist.txt -c copy output.mp4
gdzie generuje plik filelist.txt z pliku index.m3u8, narzeka na niemożność odczytania różnych plików. Ale sama konwersja plików ts wydaje się działać dobrze. Myślę, że nie używam ffmpeg poprawnie.
Jak użyć ffmpeg do połączenia plików ts opisanych przez index.m3u8 w jeden kontener mp4 za pomocą kodeka kopiującego?
-bsf:a aac_adtstoasc
.ffmpeg copy ...
, tocopy ...
(pod Windows)Używanie kopiowania lub kota do łączenia plików, takich jak aktualna najwyższa odpowiedź Szatmary, może pozostawić plik, który jest odtwarzany daleko poza limit i nie może wyszukiwać wraz z problemami z odtwarzaniem.
Zamiast tego, aby poprawnie połączyć te pliki, użyj ffmpeg, zgodnie z instrukcją https://trac.ffmpeg.org/wiki/Concatenate . (Zainstaluj ffmpeg tutaj, jeśli jeszcze go nie masz https://github.com/adaptlearning/adapt_authoring/wiki/Installing-FFmpeg .)
Jeśli jesteś zbyt leniwy, aby przeczytać mój pierwszy link, musisz w zasadzie utworzyć plik .txt zawierający listę wszystkich plików, które chcesz połączyć w podobny sposób (który mój pierwszy link zawiera instrukcje, jak łatwo to zrobić) w folderze, w którym „ ponownie wykonuję konkatenację:
Oto wklej kopię z mojego pierwszego linku w jeden sposób, aby utworzyć plik tekstowy, jeśli na przykład masz Windows w linii poleceń, ale oczywiście możesz zrobić plik ręcznie lub w dowolny sposób:
Dokładnie sprawdź, czy plik .txt wygląda dobrze i jest poprawnie sformatowany!
Następnie w wierszu poleceń uruchom:
gdzie „mylist.txt” to właśnie utworzony plik .txt.
Sprawdź, czy plik wynikowy odtwarza poprawnie wideo. Stąd możesz przesłać do MP4 jak zwykle, jeśli chcesz:
źródło
for %i in (*.ts) do
nie sortuje się poprawnie dla i> = 10. Poza tym wszystko działa, dzięki. Rzeczywiście wystąpiły problemy z połączonym plikiem, nie wspominając o tym, że plik utworzony za pomocą twojej metody okazał się być o 16% mniejszy (miałem 1400 części o 400kb).for i in {1..10}; do echo file \'$i.ts\' >> list.txt ; done
Odpowiedź z 2017 r
Gdy wykonuję
ffmpeg -i some.ts -c copy some.mp4
określone wideo, pojawia się następujący komunikat o błędzie:Nic dziwnego, że wykonanie
ffmpeg -i some.ts -c copy -bsf:a aac_adtstoasc some.mp4
go naprawia.źródło
ffmpeg
a teraz zrobi to automatycznie.Składając wszystko razem
Korzystając z odpowiedzi Juana Aquino (i poprawiając pierwsze polecenie, aby był zgodny z Bash i stosując naturalną kolejność plików), a także odpowiedź 7vujy0f0hy, prosty działający skrypt dla powłoki Linux Bash to:
źródło
Prawidłowy sposób na konkatowanie wielu plików wideo z listy odtwarzania m3u8 to
ffmpeg -i "index.m3u8" -codec copy output.mp4
-codec copy
aby uniknąć kodowania*.mp4
jest w porządku, ale wydaje się trochę powolne w multipleksowaniu, gdy playlista jest pobierana z sieci*.mkv
lub*.ts
działał najlepiej dla mnieźródło
Możesz zrobić prostą konkatenację tak (z bash):
Zamień
<number>
na najwyższy numer (oczywiście). Warianty z ffmpeg nie działały poprawnie. Wyjściowy plik wideo zacinałby się dziwnie.Korzystam z pętli for, aby zapewnić prawidłową kolejność plików. Może nie potrzebujesz tego. Być może możliwe jest nawet przesłanie danych wyjściowych do ffmpeg i konwersja do mp4 w locie.
źródło
Możesz użyć potoku tych plików ts do ffmpeg i wyprowadzić plik mp4.
cat *.ts | ffmpeg -i pipe: -c:a copy -c:v copy output.mp4
lub Jeśli nazwa pliku nie ma kolejności,
grep .*.ts index.m3u8 | xargs cat | ffmpeg -i pipe: -c:a copy -c:v copy output.mp4
źródło
Wszystkie popularne odpowiedzi na to pytanie, które wprowadzają czytelników w błąd, aby połączyć pliki TS przed uruchomieniem ffmpeg, są niepoprawne. Aby mieć pewność, że dźwięk i obraz nie będą zsynchronizowane podczas składania strumienia MP4, należy użyć słabo udokumentowanej, ale ważnej funkcji „-f concat” programu ffmpeg.
Dwa wiersze przygotowawcze kodu po prostu tworzą plik zawierający listę plików TS w tym formacie wiersza:
źródło