Posiadam konto shell z dostępem przez ssh. Chciałbym w wybranych godzinach nagrać obraz video z kamery znajdującej się na stronie internetowej. Strumień jest w formacie m3u8, a chciałbym, aby został zapisany w formacie mp4.
Jakim poleceniem, przy użyciu wget i crona, zaplanować takie nagrywanie z automatyczną konwersją?
Plik m3u8 to tylko manifest strumienia - zawiera odwołanie do plików TS, z których składa się strumień.
Mp4 to tylko kontener, jeśli źródłowy strumień zawiera video w formacie H.264 i audio AAC to wystarczy go muxować, bez konwersji.
@MatX1, pozwolę sobie dopytać o jeszcze jedną rzecz. Czy w tym poleceniu da się, przy użyciu odpowiednich parametrów, sprawić, by nagrany plik mp4 był bez dźwięku oraz w rozdzielczości 480p? Jeśli tak, to jak powinno wyglądać takie zmodyfikowane polecenie?
To polecenie zignoruje audio i będzie transkodowało w locie strumień źródłowy video do H.264 z przyzwoitą jakością i rozdzielczością 480p.
Pamiętaj jednak, że transkodowanie video (w przeciwieństwie do zwykłego muxowania) to proces bardzo zasobożerny pod względem CPU, więc na publicznym shellu może to nie być dozwolone.
parametr „preset” odpowiada za to jak efektywne jest kodowanie. Im wolniejszy preset tym większe obciążenie CPU, ale jednocześnie mniejszy plik wynikowy.
-crf pozwala na dopasowanie oczekiwanej jakości, im wyższy tym gorsza jakość, ale mniejszy plik.
Pokombinuj z tymi parametrami, aby znaleźć złoty środek.
Jeszcze protip:
Proponuję zamiast .mp4 użyć kontenera .ts.
Niepoprawnie zapisany plik mp4 np. wskutek crashu programu będzie bezużyteczny.
Zamieniając kontener na mpegts masz pewność, że dotychczas zapisane nagranie będzie możliwe do odtworzenia (kosztem trochę większego overheada pliku)
@MatX1, działa. Jednak widzę we właściwościach, że nagrany plik ma bardzo małą szybkość danych i całkowitą szybkość transmisji: 62 kb/s. Którym parametrem ją zwiększyć? Ewentualnie, jak zachować oryginalny bitrate?
Dlatego wstawia się je w pole na kod, nawet na smartfonie znak ` jest łatwo dostępny by zrobić pole na kod liniowe/blokowe (o ile nie walniesz literówki pisząc dwoma palcami na powierzchni „2 cali kwadratowych”).
Raczej 4 spacje przed są problematyczne jak to będzie dłuższy kod „programistyczny”, opcjonalnie BBcode liniowe już działa poprawnie a nie jak w 2017, że są posty @marcin82 bez poleceń widocznych a i on ich nie skorygował w 60 dni od otrzymania PW.
Pożądaną jakość możesz zmienić schodząc niżej z -crf.
Nie polecam jednak ustawiać wartości niższych niż 18 - prawdopodobnie będzie to strata miejsca.
Nie przejmowałbym się takim niskim bitratem - będzie on dobierany w zależności od potrzeb i nie ma sensu sztucznie go podbijać.
Dla statycznej sceny w 480p taki bitrate jest w porządku
Historia PW nie przypomina sobie PW ani od ciebie, ani od systemu ani od moderatora w kwestii poprawy składni jakichkolwiek postów. Pamięć zawodzi czy co sobie wymyśliłeś?
Zmieniał się silnik, kody w jakiejś formie przestały działać albo przy aktualizacji silnika, etc.
@MatX1, na razie wszystko działa bez zarzutu. Mam jeszcze 2 pytania:
Wspomniałeś o parametrze ‘preset’, że im wolniejszy, tym większe obciążenie CPU. Czy zatem im szybszy, tym konwersja trwa dłużej? Czy to oznacza, że wówczas plik będzie gotowy dopiero po jakimś czasie od zakończenia nagrywania?
Nie, im szybszy tym kompresja trwa krócej, bo jest mniej wymagająca (i efektywna) niż preset wolniejszy.
Jeśli CPU „nie wyrabia” przy transkodowaniu na żywo, to ffmpeg obniża liczbę klatek na sekundę w danym momencie.
Czyli np. źródło ma stałe 30 fps, ale z uwagi na brak mocy docelowy klip momentami ma 20 fps.
Nie wydaje mi się, żeby było jakieś polecenie zatrzymujące nagrywanie, możesz spróbować standardowo ctrl+c.