Wie implementiere ich einen Frontend-Media-Player mit hoher Kompatibilität?

Hätte jetzt keine direkt Lösung, aber warum schaust du nicht einfach im Source von Kodi nach, wie die es gelöst haben?
 
ich such schon die ganze zeit. Gerade versuch ich es mit Range requests aber die kann ein HTML5 Video offenbar gar nicht erst verstehen... ich habs schon versucht indem ich den Stream zurückgegeben habe und ihn mit Task.Run beschrieben habe sodass die response sofort da ist und der Stream später beschrieben wird aber so funktioniert es auch nicht...

Dann schreibe ich direkt in den Response.Body, aber auch ohne erfolg... mir fällt bal dnichts mehr ein :(
 
Ich schätze dein Response wird erst bei return Ok(); abgeschickt (weil du bis dahin noch Header ändern könntest?!). Google mal, wie du mit .NET Core wirklich die Response Streamen kannst.
 
Bagbag schrieb:
Ich schätze dein Response wird erst bei return Ok(); abgeschickt (weil du bis dahin noch Header ändern könntest?!). Google mal, wie du mit .NET Core wirklich die Response Streamen kannst.
die machen es alle so...
normalerweise öffnet man nen filestream mit file.openRead z.B. und dann gibst du es als FileStreamResponse zurück. mach ich ja auch!

das Problem ist nur dass der FileStream ja erst beschrieben wird und das existiert wirklich nirgends! ich hab schon gegoogelt wie man eine WebCam über nen Core Controller streamt denn das wäre ja genau mein scenario, aber leider - nix.
 
Offenbar musst du das Bedienen von Google erlernen. 3 Sekunden habe ich gebraucht um das zu finden:

C#:
[HttpGet]
public FileStreamResult GetTest()
{
  var stream = new MemoryStream(Encoding.ASCII.GetBytes("Hello World"));
  return new FileStreamResult(stream, new MediaTypeHeaderValue("text/plain"))
  {
    FileDownloadName = "test.txt"
  };
}
 
Bagbag schrieb:
Offenbar musst du das Bedienen von Google erlernen. 3 Sekunden habe ich gebraucht um das zu finden:

C#:
[HttpGet]
public FileStreamResult GetTest()
{
  var stream = new MemoryStream(Encoding.ASCII.GetBytes("Hello World"));
  return new FileStreamResult(stream, new MediaTypeHeaderValue("text/plain"))
  {
    FileDownloadName = "test.txt"
  };
}
Das problem ist dass es nicht funktioniert wenn ich einen Stream zurückgebe der erst noch beschrieben wird! das ist das hauptproblem hier.
 
Das Problem ist eher:

wenn ich den Stream vor dem zurückgeben beschreibe dauert er 5 Stunden weil er dann die Antwort erst zurückgibt wenn die Konvertierung fertig ist.

Wenn ich den Stream zurückgebe und mit Task.Run den Konvertierungsprozess ausführe kommt er sofort zurück aber ich krieg zurück
1619174067466.png
und ffmpeg.exe wird gar nicht erst gestartet
Ergänzung ()

Ich glaube der Stream wird nach dem zurückgeben geschlossen und kann folglich nicht mehr weitergegeben werden :(
 
Zuletzt bearbeitet:
Kokujou schrieb:
wenn ich den Stream vor dem zurückgeben beschreibe dauert er 5 Stunden
Wenn die encodierung länger dauert als das abspielen dann ist das immer schlecht. Aber da kann man ja mit entsprechenden Optionen nachhelfen.

Kokujou schrieb:
weil er dann die Antwort erst zurückgibt wenn die Konvertierung fertig ist.
Du musst ffmpeg asynchron aufrufen und dann halt das was aus der Pipe kommt "aufsammeln" und rausschicken.
 
andy_m4 schrieb:
Wenn die encodierung länger dauert als das abspielen dann ist das immer schlecht. Aber da kann man ja mit entsprechenden Optionen nachhelfen.


Du musst ffmpeg asynchron aufrufen und dann halt das was aus der Pipe kommt "aufsammeln" und rausschicken.
ja, aber wie?
ich rufe ihn ja asynchron auf wie du siehst... aber wie gesagt, wenn ich awaite dann warte ich den kompletten call ab. wenn ich ihn nicht awaite wird der response stream beim zurückgeben geschlossen und der vorgang bricht ab... also was soll ich tun?
 
Deine eigene StreamResult Klasse implementieren. Und du scheinst das Video mit h264 neu zu kodieren, natürlich ist das langsam. Du darfst nur den Container anpassen und die Mediastreams musst du 1:1 kopieren.
 
Bagbag schrieb:
Deine eigene StreamResult Klasse implementieren. Und du scheinst das Video mit h264 neu zu kodieren, natürlich ist das langsam. Du darfst nur den Container anpassen und die Mediastreams musst du 1:1 kopieren.
und wie?
 
andy_m4 schrieb:
Ähm. Du solltest schon die Programmiersprache kennen, die Du nutzt :-)
Die Klasse Process() bietet doch die benötigte Funktionalität an.
ich benutze ja extra einen wrapper... wie gesagt du siehst es doch in meinem codebeispiel, ich benutze ja ProcessAsync. Aber wie ich bereits sagte, wen ich den Stream zurückgebe wird er geschlossen und ffmpeg bricht ab, wenn nicht wartet er bis die konversion fertig ist...
Ergänzung ()

jetzt bin ich mal auf die low-level methode übergegangen... das ergebnis sind gefühlte 80.000 webrequests... keine ahnung warum.. die fehlerausgabe ist auch nicht sehr hilfreich...
Code:
var ffmpeg = new Process();
            var startinfo = new ProcessStartInfo("D:\\Programme\\ffmpeg\\bin\\ffmpeg.exe",
                $"-i {filePath} -o -");
            startinfo.RedirectStandardError = true;
            startinfo.RedirectStandardOutput = true;
            startinfo.RedirectStandardInput = true;
            startinfo.UseShellExecute = false;
            startinfo.CreateNoWindow = true;
            ffmpeg.StartInfo = startinfo;
            ffmpeg.ErrorDataReceived += OnErrorDataReceived;

            ffmpeg.Start();
            ffmpeg.BeginErrorReadLine();

            return File(new BufferedStream(ffmpeg.StandardOutput.BaseStream), "video/mp4", "video.mp4");
 
Zuletzt bearbeitet:
Ich sehe bei Deinem Quelltext nicht so ganz durch. Zum Beispiel finde ich auch gar keinen richtigen Aufruf von ffmpeg. Ja. Du rufst das irgendwie auf. Übergibst offenbar auch irgendwie mit einen Dateinamen. Aber mehr ist da nicht erkennbar. Schon gar nicht, das Du ffmpeg anweist die Ausgabe nach stdout zu schicken.
 
andy_m4 schrieb:
Ich sehe bei Deinem Quelltext nicht so ganz durch. Zum Beispiel finde ich auch gar keinen richtigen Aufruf von ffmpeg. Ja. Du rufst das irgendwie auf. Übergibst offenbar auch irgendwie mit einen Dateinamen. Aber mehr ist da nicht erkennbar. Schon gar nicht, das Du ffmpeg anweist die Ausgabe nach stdout zu schicken.
ich kenn mich mit ffmpeg auch gar nicht aus ich dachte "-o -" würde das machen
 
:watt:

Du packst da einfach Parameter hin ohne zu wissen obs die gibt und was die machen?
 
Bagbag schrieb:
:watt:

Du packst da einfach Parameter hin ohne zu wissen obs die gibt und was die machen?
nein ich sehe 5 google antworten die alle was anderes sagen also probier ich jeden aus und hoffe es funktioniert >.< warum können die keine anständigen parameternamen benutzen?
-o klang für mich nach output und ich seh leere striche die wohl n output redirect darstellen sollen...

wie wärs mit -writeTo stdout?
 
So kommt mir das auch vor. Du kennst dich nicht aus. Machst irgendwas und hoffst es würde funktionieren.
Ich würde ja mal die Doku konsultieren. Ich würde, bevor ich was einbaue das erst mal als Trockenübung an der Kommandozeile testen usw. usw. usw.
Halt so ein bissl systematisch an die Sache herangehen.
 
  • Gefällt mir
Reaktionen: BeBur
hätte vielleicht jemand ein codebeispie wie man MKV zu MP4 konvertiert und das an stdout weiterleitet...
 
Zurück
Oben