MARCIN_ZIOMEK Posted March 12 Report Posted March 12 Siema, ostatnio zapragnąłem stworzenia transmisji HLS z moimi ulubionymi kawałkami W tym celu na moim serwerze na proxmoxie postawiłem debiana, na którym to też postawiłem apache oraz sambe (do wrzucania plików wideo), zainstalowałem też ffmpeg. Próbowałem wygenerować sobie skrypt w różnych chatach AI Jego założeniem było to umieszczenie pliku stream.m3u8 wraz z segmentami .ts w /var/www/html/vidstream Pliki wideo miał pobierać z /home/user/mov i na podstawie ich tworzyć playlistę z plikami wideo w losowej kolejności A sam skrypt znajdował się w /home/user/script.sh (z uprawnieniami execute - wiadomo) Skrypt miał umożliwiać cofnięcie transmisji maksymalnie o 5 minut wstecz oraz usuwanie usuniętych plików .ts ze stream.m3u8 aby zapobiec zapełnianiu dysku, ponadto miał wykrywać on na bieżąco nowe pliki umieszczone w /home/user/mov i dodawać je do playlisty (bez duplikatów, żeby przypadkiem plik playlisty nie rozrósł się do chorych rozmiarów). Po zakończeniu playlisty skrypt miał generować od nowa playlistę - i tak w kółko, w nieskończoność. Pliki żródłowe (wideo) były w różnych kodekach - h264, h265 oraz różnych rozdzielczościach jednak transmisja miała być w 1080p 60kl (przez skalowanie) i używać tylko i wyłącznie h264 (w tym celu ffmpeg miał kodować całą transmisję w h264) Dodatkowo chciałem aby skrypt na bieżąco pokazywał pozycję pliku na liście np 1/4, nazwę pliku z filmem oraz jego kodek Jednak napotkałem różne problemy 1. Po odtworzeniu na transmisji np pierwszego nagrania to zamiast otworzyć drugie to transmisja się wywalała - udało mi się to koniec końców naprawić, nie wiem jak ale zaczęło działać. 2. Czasem transmisja się przycinała (mimo tego że testowałem ją tylko w sieci lokalnej), z czasem też jakoś się naprawiło, czasem też problem powracał. 3. Jednak tu napotkałem problem nie do przeskoczenia - ffmpeg kodował tak szybko żródłowe pliki wideo do .ts że skrypt zdążył je usunąć jeszcze przed ich odtworzeniem. Próbowałem to ograniczyć poprzez danie kagańca ffmpeg w postaci tylko jednego rdzenia, jednak to zbyt wiele nie dało. 4. Ten problem to bardzo duże obciążenie procesora szczególnie jeżeli ffmpeg działał na wszystkich 4 rdzeniach, (mój serwer w postaci "terminala" Lenovo m910q z wsadzonym Xeonem 2276m z Ali pracował jak suszara, wcześniej był tu i5-6500t, oczywiście obniżyłem trochę wartości tdp, zpatchowany bios umożliwia manipulację przy tych wartościach, temperatury nie przekraczają z reguły 80 stopni), obcięcie do 1 rdzenia poniekąd zmniejszało ten problem, ale nie jest to zbyt satysfakcjonujące rozwiązanie. I teraz pytanie główne Co zrobić aby ffmpeg nie kodował plików źródłowych na wyrost? Aby prędkość kodowania mniej więcej skalowała się z czasem trwania materiału? A może jest jakiś inny sposób na taką transmisję na żywo, aby nadawać playlistę lecącą w czasie rzeczywistym, żeby można też było to sobie potem umieścić na liście m3u. I przede wszystkim - Jak powinien wyglądać taki skrypt? EDIT Trochę zmieniłem prompta i ogólnie moje wymagania, teraz wygląda to tak Cytat Napisz skrypt, który będzie się mieścił w /home/unboxorg/script.sh, który będzie tworzył transmisję HLS w lokalizacji /var/www/html/vidstream/stream.m3u8 z plików wideo znajdujących się w lokalizacji /home/unboxorg/mov (ma obsługiwać wszystkie popularne formaty plików wideo) - w skrócie chodzi o to żeby z plików wideo znajdujących się tam tworzył playlistę dobierając za każdym razem te pliki w losowej kolejności (bez duplikatów), jeżeli playlista się skończy skrypt ma stworzyć ją od nowa i tak w nieskończoność przy czym ma zachować CIĄGŁOŚĆ transmisji, przejścia pomiędzy klipami wideo mają być nieodczuwalne w żaden sposób na transmisji. Chcę, aby nowe pliki wideo znajdujące się w /home/unboxorg/mov były NA BIEŻĄCO wykrywane i dodawane do playlisty Chcę, aby transmisja była w 1080p, 60kl/s i z wykorzystaniem kodeka h264 (jeżeli jest INNA rozdzielczość pliku źródłowego to ma być rozciągany do 1080p 60kl/s, jeżeli kodek pliku źródłowego jest INNY niż h264 to ma być kodowany do h264) bo pliki źródłowe mogą mieć różne rozdzielczości i kodeki Chcę aby pliki .ts były przechowywane maksymalnie godzinę, po czym mają być usuwane (zarówno ze swojej lokalizacji jak i z pliku stream.m3u8) Chcę aby skrypt był napisany w taki sposób aby ffmpeg NIE TWORZYŁ PLIKÓW .ts NA WYROST, aby zapobiec temu, że zostaną one usunięte jeszcze przed ich odtworzeniem, to ma działać na żywo, to ma się skalować z długością pliku wideo - w skrócie ffmpeg w danym momencie ma kodować tylko i wyłącznie odtwarzany plik wideo. Chcę aby transmisja działała niezawodnie i była jak najlepiej zoptymalizowana pod kątem zużycia procesora (ogranicz działanie do dwóch rdzeni) Chcę żeby skrypt przy każdym uruchomieniu usuwał stare pliki .ts Na koniec - chcę aby skrypt pokazywał na bieżąco którą pozycję z playlisty odtwarza (mają być ponumerowane), ma pokazywać nazwę aktualnie odtwarzanego pliku wideo, jego kodek oraz czas odtwarzania (np 01:30/05:37) Skrypt ma działać na systemie debian Proszę napisz mi go ZGODNIE ZE WSZYSTKIMI PODANYMI WYŻEJ WYTYCZNYMI, NIE ZAPOMINAJĄC O ŻADNEJ Z NICH A to jest skrypt który wypluł mi popularny chat AI Jednak ma on niewiele wspólnego z tym czego oczekuję Cytat [Zawartość widoczna tylko dla zalogowanych użytkowników] Edit v2 Okazało się że moim największym problemem było robienie tego jako skryptu bash, postanowiłem spróbować w pythonie i osiągnąłem nawet akceptowalny efekt Jak ktoś chce to może rzucić okiem na to, może uda się go jakoś zoptymalizować Cytat [Zawartość widoczna tylko dla zalogowanych użytkowników] Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.