Dag mede-tweakerts,
Ik zit nu al een aantal weken te worstelen met een stuk perfectie die ik maar niet krijg bereikt.
Ik zal eerst mijn situatie uitleggen.
Situatie
Ik stream video van een mediaserver, genaamd Firefly Media Server.
Deze server biedt dynamische mogelijkheid om via commandline de media te transcoden naar wens.
Zodra ik een .avi opvraag van de mediaserver, begint deze met transcoden naar FLV, en gooit de stream naar mij, de client toe. Dit werkt in een flash player in de browser. (ter verduidelijking, het transcoden gebeurt server-side. client-side zie ik alleen een flv stream)
Ik maak gebruik van ffmpeg om de .avi te transcoden naar flv.
Natuurlijk heeft de FLV (tijdens het transcoden) geen metadata, waardoor 'seeken' door het filmpje niet mogelijk is. Ffmpeg biedt functionaliteit om metadata mee te nemen. Maar na al mijn pogingen geen succes; Ik vermoed dat de metadata _na_ het transcoden pas geinjecteerd wordt.
Halve oplossing?
Ik heb de output van ffmpeg gepiped naar flvtool2, een tool die een flv kan injecteren met metadata.
Ik heb gekozen voor flvtool2 omdat alles via commandline gaat, en flvtool2 de enige is die zowel stdin als stdout ondersteunt. Dit werkt wel, maar met een zuur resultaat: Ffmpeg transcode eerst de hele video, flvtool2 doet zijn ding, en dan pas wordt er de stream naar de client gestuurd. Niet helemaal het idee van 'on-the-fly' transcoding dus.
Ik heb nu 2 werkende 'oplossingen':
- Direct streamen, maar geen metadata, waardoor seeken niet mogelijk is. Geeft ook niet aan hoever het bufferen is; Wanneer de video de buffer inhaalt, moet je opnieuw beginnen.
- Eerst de hele video transcoden (terwijl de client wacht) en daarna pas beginnen met streamen. Niet naar wens, want een filmpje van 1 minuut duurt al 6 seconden om te transcoden. Die 6 seconden gaan in zodra je op play drukt, terwijl je verwacht dat het filmpje begint te streamen.
Pogingen
Ik heb naar meerdere oplossingen gekeken. De bovenstaande kwamen er uit. Ik heb geprobeerd gebruik te maken van ffserver, maar deze biedt geen oplossing.
Om het samen te vatten; Ik streef naar een oplossing om via een commandline een .avi te transcoden naar .flv, waar vanaf het begin al de metadata in staat. Dit klinkt als tegenspraak, want metadata wordt altijd achteraf geinjecteerd.
Heeft iemand tips hoe ik avi's on-the-fly kan transcoden, speelbaar zijn in een browser, maar ook seekable zijn?
P.S. Modje: Mocht het topic fout geplaatst zijn, wilt u zo vriendelijk zijn deze op een goede plek te zetten? Danku.
Ik zit nu al een aantal weken te worstelen met een stuk perfectie die ik maar niet krijg bereikt.
Ik zal eerst mijn situatie uitleggen.
Situatie
Ik stream video van een mediaserver, genaamd Firefly Media Server.
Deze server biedt dynamische mogelijkheid om via commandline de media te transcoden naar wens.
Zodra ik een .avi opvraag van de mediaserver, begint deze met transcoden naar FLV, en gooit de stream naar mij, de client toe. Dit werkt in een flash player in de browser. (ter verduidelijking, het transcoden gebeurt server-side. client-side zie ik alleen een flv stream)
Ik maak gebruik van ffmpeg om de .avi te transcoden naar flv.
Probleemffmpeg -i "$FILE" -f flv -ar 22050 -qscale 5 -
Natuurlijk heeft de FLV (tijdens het transcoden) geen metadata, waardoor 'seeken' door het filmpje niet mogelijk is. Ffmpeg biedt functionaliteit om metadata mee te nemen. Maar na al mijn pogingen geen succes; Ik vermoed dat de metadata _na_ het transcoden pas geinjecteerd wordt.
Halve oplossing?
Ik heb de output van ffmpeg gepiped naar flvtool2, een tool die een flv kan injecteren met metadata.
Ik heb gekozen voor flvtool2 omdat alles via commandline gaat, en flvtool2 de enige is die zowel stdin als stdout ondersteunt. Dit werkt wel, maar met een zuur resultaat: Ffmpeg transcode eerst de hele video, flvtool2 doet zijn ding, en dan pas wordt er de stream naar de client gestuurd. Niet helemaal het idee van 'on-the-fly' transcoding dus.
Resultaatffmpeg -i "$FILE" -f flv -ar 22050 -qscale 25 - | flvtool2 -U stdin stdout
Ik heb nu 2 werkende 'oplossingen':
- Direct streamen, maar geen metadata, waardoor seeken niet mogelijk is. Geeft ook niet aan hoever het bufferen is; Wanneer de video de buffer inhaalt, moet je opnieuw beginnen.
- Eerst de hele video transcoden (terwijl de client wacht) en daarna pas beginnen met streamen. Niet naar wens, want een filmpje van 1 minuut duurt al 6 seconden om te transcoden. Die 6 seconden gaan in zodra je op play drukt, terwijl je verwacht dat het filmpje begint te streamen.
Pogingen
Ik heb naar meerdere oplossingen gekeken. De bovenstaande kwamen er uit. Ik heb geprobeerd gebruik te maken van ffserver, maar deze biedt geen oplossing.
Om het samen te vatten; Ik streef naar een oplossing om via een commandline een .avi te transcoden naar .flv, waar vanaf het begin al de metadata in staat. Dit klinkt als tegenspraak, want metadata wordt altijd achteraf geinjecteerd.
Heeft iemand tips hoe ik avi's on-the-fly kan transcoden, speelbaar zijn in een browser, maar ook seekable zijn?
P.S. Modje: Mocht het topic fout geplaatst zijn, wilt u zo vriendelijk zijn deze op een goede plek te zetten? Danku.