Jump to content

Stworzenie transmisji HLS z plików wideo (mp4, avi, mov itd)


Recommended Posts

Posted

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]

 

 

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...

Important Information