Pytanie:
Jak zamówić i scalić wiele plików .ts?
Léo Léopold Hertz 준영
2016-01-27 19:21:40 UTC
view on stackexchange narkive permalink

Mam wiele małych plików (około 500). Są we właściwej kolejności. Chciałbym je połączyć. Polecenia Linuksa są również mile widziane, ponieważ mogę je skompilować w moim OS X. Polecenie cat * .ts > masi.ts nie działa dobrze. Wynik zatrzymuje się w niektórych punktach. Badam, dlaczego tak się dzieje. Niektóre fragmenty filmów nie są w porządku.

Nazwy części filmów, w których każdy plik ma prefiks HRmasi453-27012016.mp4.ts

  1.ts2.ts ... 100.ts101.ts ... 200.ts ... 300.ts  

, więc nazwa pliku to HRmasi453-27012016.mp4-01.ts .. . HRmasi453-27012016.mp4-300.ts . Polecenie cat * .ts > masi.ts nie porządkuje wideo w kolejności. Myślę, że powinienem zrobić listę wszystkich pozycji w kolejności. Następnie połącz.

Pseudokod

  1. Utwórz listę filmów w kolejności
  2. Scal pozycje kota na liście
    • Zrób coś takiego jak filename = prefix + itemInList bez tworzenia nowej listy w pętli while.
    • cat filename >> result.ts

Jak dołączyć do wielu plików wideo , .ts, pliki?

Wcale nie jestem pewien, czy to zadziała, ale możesz spróbować najpierw z kilkoma plikami. Czy próbowałeś następnie połączyć z `cat`?
@user3439894 Dziękuję za propozycję!Jest kilka błędów.Pewne luki na niektórych etapach, których nie rozumiem.Ponownie nagram pokaz flasha, a następnie ponownie przetestuję.Czasami kolejność filmów jest różna, prawdopodobnie z powodu nazewnictwa.
Czy jedyne liczby w elemencie „itemInList” są poprzedzone 0 (zero), np. 01 ... 09 i jaka jest rzeczywista całkowita liczba plików?
Zobacz moją zaktualizowaną odpowiedź.
Pięć odpowiedzi:
#1
+8
user3439894
2016-01-27 21:27:27 UTC
view on stackexchange narkive permalink

Muszę to poprzedzić, mówiąc, że nie pracowałem z plikami .ts Nie wiem, czy można je po prostu łączyć za pomocą cat i jak widziałeś, ponieważ są one nazywane numerycznie, które są pomieszane podczas używania cat * .ts > masi.ts , ponieważ sortuje leksykograficznie, więc użycie uporządkowanej listy jest w porządku. Mając to na uwadze, oto co zrobiłem, aby utworzyć listę 500 numerycznie nazwanych plików .ts , a następnie połączyć je za pomocą listy.

Najpierw utworzyłem 500 numerycznie nazwanych .ts zawierające numer nazwy pliku .ts jako kontrolkę. Użyłem for i w {1..500}; do echo $ i > $ i.ts; gotowe To nie były w rzeczywistości prawidłowe pliki .ts , ale pozwoliło mi to mieć 500 plików do pracy, a następnie zobaczyć, że zostały one połączone w odpowiedniej kolejności podczas otwierania pliku . ts , aby zobaczyć uporządkowaną listę numeryczną w pliku.

Ponieważ masz już 500 plików .ts , w Terminalu wykonaj następujące czynności:

  cd ts_files_directoryecho {1..500} .ts | tr "" "\ n" > tslistwhile read line; wykonaj cat $ line >> mixed.ts; done < tslist  


Zaktualizowano w celu uwzględnienia rzeczywistej nazwy pliku w komentarzu do mojej odpowiedzi i zaktualizowanego pytania.

W poniższym założeniu że jedyne liczby w itemInList z początkowym 0 (zero) to np. 01 ... 09 i że zmieniono 500 w {100..500 } część polecenia na rzeczywistą liczbę.

Zmień katalog na ten, który zawiera pliki .ts .

  cd ts_files_directory  

Poniższe dwa polecenia tworzą plik tslist , który jest numerycznie uporządkowaną listą nazw plików docelowych, które mają być używane z cat , aby uniknąć problemów z sortowaniem leksykograficznym.

  echo 'HRmasi453-27012016.mp4 -' {01..99} .ts | tr "" "\ n" > tslistecho 'HRmasi453-27012016.mp4 -' {100..500} .ts | tr "" "\ n" >> tslist  

Po utworzeniu listy uporządkowanej numerycznie użyj następującego wiersza poleceń, aby dokonać konkatenacji na podstawie zawartości pliku tslist .

  podczas czytania linii; wykonaj cat $ line >> mixed.ts; gotowe < tslist  
Nazwa pliku faktycznie zawiera również `HRmasi453-27012016.mp4-`.Więc konkatenacja jest wymagana.Uruchomiłem bez powodzenia `do cat 'HRmasi453-27012016.mp4-" $ line "` `. Również awaria w` echo "HRmasi453-27012016.mp4-" {1 ... 500} ". Jak myślisz, gdzie najlepiejpołączyć prefiks z pozycjami na liście? Myślę, że nie jest mądre umieszczanie ciągu znaków w elementach listy, zajmując dużo miejsca w rzeczywistości. Myślę, że lepiej jest połączyć, a potem w jakiś sposób zrobić cat.
Świetny!Wydaje się, że działa.Muszę dodać kilka globów przez `echo 'HRmasi453-2701201? .Mp4 -' {01..99} .ts |tr "" "\ n"> tslist`.
Rozszerzyłem wątek o zapewnienie jakości.Studiuję zapewnienie jakości łączenia wideo tutaj http://unix.stackexchange.com/q/258113/16920
@Masi, Jeśli nazwy plików były takie, jak pokazałeś i podałeś do ostatniego „-”, np.`HRmasi453-27012016.mp4-`, to nie rozumiem, dlaczego musiałeś zmienić go na `` HRmasi453-2701201? .Mp4-`.Mimo to cieszę się, że mogłeś wykorzystać to, co przedstawiłem.Dodatkowo chciałbym dodać, że gdybyś podał dokładniejsze i pełniejsze informacje podczas zadawania pytania, znacznie łatwiej byłoby udzielić dokładnych odpowiedzi na sytuację.Tylko myśl.:)
Dziękuję za Twój komentarz!Robię, co w mojej mocy, aby przedstawić tak jasne szczegóły spraw, jak tylko mogę.Często jednak sprawa ewoluuje, gdy rozumiem to lepiej po interakcji z Tobą.Dlatego czuję się odpowiedzialny za redagowanie i aktualizowanie sprawy tak jasno, że Ty też możesz skorzystać.Dlatego też rozszerzyłem sprawę na nowy wątek, ponieważ czuję się odpowiedzialny za dzielenie się wiedzą, której nauczyłem się stosując kod w moich wyzwaniach.W rzeczywistości są bardziej wymagające niż kiedykolwiek myślałem, ale dające się opanować.
Na marginesie, jeśli chcesz czytać listę plików `ts` po ich sygnaturze czasowej, możesz zmienić wiersz 2 powyżej na` ls -tr * .ts |tr "" "\ n"> tsList`
#2
+1
stackdave
2017-11-08 00:06:43 UTC
view on stackexchange narkive permalink

Bardzo łatwy sposób oparty na dokumentach ffmpeg;zaakceptowana odpowiedź jest bardziej skomplikowana.

  1. najpierw wydrukuj całą listę plików w pliku: mylist.txt, podaj rozszerzenie swojego pliku, tutaj jest .ts

      printf "plik '% s' \ n" ./*.ts > mylist.txt
    
  2. na koniec dołącz do pliku za pomocą listy txt, ostatnia nazwa parametru dołączonego pliku, użyj tego samego rozszerzenia, co pliki źródłowe.

      ffmpeg -f concat -safe 0 -i mylist.txt -c copy output.ts
    

więcej informacji o konkatenacji:

https://trac.ffmpeg.org/wiki/Concatenate

Czy możesz porównać swoją odpowiedź z odpowiedzią użytkownika3439894?
co masz na myśli?moja odpowiedź to prosta podstawa w dokumentach ffmpeg
Plik `printf ''% s '\ n' ./*.ts> mylist.txt` nie działa z dokładnie tego samego powodu, dla którego OP został wysłany w pierwszej kolejności.Plik „mylist.txt” nie będzie zawierał prawidłowo uporządkowanej listy plików „.ts” ze względu na ich nazwę, a wideo zostanie uszkodzone, ponieważ pliki „.ts” na liście nie są uporządkowane.Zobacz ten link do zawartości mylist.txt: https://paste.ee/p/ufu0S
@Léo Léopold Hertz 준영, Zobacz mój komentarz do odpowiedzi stackdave.
po prostu pozwól innym oceniać za lub przeciw, nie trać czasu
#3
  0
Steve Chambers
2016-01-27 19:55:35 UTC
view on stackexchange narkive permalink

Chociaż sam tego nie zrobiłem, widziałem dyskusje, w których ludzie łączyli wiele plików wideo za pomocą wersji FFMPEG z wiersza poleceń.

Uważam, że istnieje wersja na komputery Mac, więc nie musisz skompiluj go ze źródła na ffmpeg.org, ale poza tym ktoś inny będzie musiał to zweryfikować i pomóc Ci w poprawnej składni polecenia.

#4
-1
user199255
2016-08-30 09:47:07 UTC
view on stackexchange narkive permalink

cat? .ts ??. ts ???. ts> all.ts

Zgodnie z pytaniem, wszystkie pliki mają przedrostek „HRmasi453-27012016.mp4.ts”, więc użyte symbole wieloznaczne mogą wymagać dopracowania.
#5
-1
Joe Hillman
2020-01-19 11:08:48 UTC
view on stackexchange narkive permalink

Rozumiem, że szukasz eleganckiego rozwiązania wiersza poleceń.Jeśli jednak używasz MKVToolnix, możesz załadować pierwszy plik TS i dołączyć (scalić) nieograniczoną liczbę plików ts, które mają być następnie multipleksowane w celu utworzenia pliku mkv (na przykład 10, 5-sekundowe filmy wideo będą multipleksowane do 50-sekundowego pliku mkv).Następnie możesz zmiksować mkv z powrotem do ts w tsmuxergui.



To pytanie i odpowiedź zostało automatycznie przetłumaczone z języka angielskiego.Oryginalna treść jest dostępna na stackexchange, za co dziękujemy za licencję cc by-sa 3.0, w ramach której jest rozpowszechniana.
Loading...