Streaming MP4 z ffmpeg

16

Muszę utworzyć kanał, który ma dwa strumienie - webm i mp4 - aby był kompatybilny ze wszystkimi odtwarzaczami wideo HTML5. Strumień webm działa idealnie. Jednak podczas próby uzyskania dostępu do strumienia mp4 serwer wyrzuca następujący błąd:

Sat Mar  9 23:21:54 2013 muxer does not support non seekable output

Oto część pliku ffserver.conf, która dotyczy strumienia mp4:

<Stream channel1.mp4>       # Output stream URL definition
   Feed feed1.ffm              # Feed from which to receive video
   Format mp4

   # Audio settings
   AudioCodec libmp3lame
   AudioBitRate 64             # Audio bitrate

   # Video settings
   VideoCodec libx264
   VideoSize 560x320           # Video resolution
   VideoFrameRate 25           # Video FPS
   AVOptionVideo flags +global_header  # Parameters passed to encoder
                                       # (same as ffmpeg command-line parameters)
   AVOptionVideo cpu-used 0
   AVOptionVideo qmin 10
   AVOptionVideo qmax 42
   AVOptionVideo quality good
   AVOptionAudio flags +global_header
   PreRoll 15
   StartSendOnKey
   VideoBitRate 400            # Video bitrate
</Stream>

Z tego, co mogę znaleźć, niektórzy twierdzą, że mp4 po prostu nie może być przesyłany strumieniowo. Nie mam przywiązania do mp4, z wyjątkiem faktu, że miałem wrażenie, że potrzebujesz mp4, aby przesyłać strumieniowo wideo do iPhone'a za pomocą odtwarzacza wideo HTML5. Jeśli tak nie jest, daj mi znać, a chętnie przejdę do czegoś, co gra ładniej przy streamingu ffmpeg.

Fibericon
źródło
3
Tak naprawdę nie musisz przesyłać strumieniowo MP4. W przypadku wideo HTML5 H.264 / MP4 powinno wystarczyć zakodowanie pliku wideo -movflags faststartlub potraktowanie go qt-faststart, a następnie wskazanie pliku MP4 w <video>znaczniku. Twój serwer potrzebuje wtedy modułu przesyłania strumieniowego H.264, aby umożliwić klientowi wyszukiwanie. Czy masz wkład na żywo?
slhck,
Mój klient wymaga przesyłania strumieniowego - chce całkowicie wyłączyć wyszukiwanie klienta. Jest przesyłany strumieniowo z pliku (plik na serwerze ma format webm, jeśli ma to znaczenie). Nie mogę po prostu ukryć elementów sterujących, ponieważ iPhone'y wymuszają wyświetlanie elementów sterujących.
Fibericon,
@slhck: Przesyłam strumieniowo dane z kamery internetowej na żywo za pomocą mp4, ale nie mogę tego zrobić. Działa, gdy używam flv. Czy można używać MP4 do strumieniowania na żywo?
John Qualis
@JohnQualis Nie jestem pewien, czy można to zrobić za pomocą ffserver. Ale kontener nie powinien mieć tak naprawdę znaczenia - kodeki są takie same z FLV i MP4 (H.264 i AAC).
slhck
@sklhck: Mam go do pracy z flv za pomocą ffserver, ale nie z mp4. Większość przeglądarek internetowych obsługuje MP4. Potrzebuję czegoś, co działa na iPhonie, Androidzie i na wszystkich znanych przeglądarkach internetowych, i że jest jego h264 :) I przesyłam strumieniowo kamerę internetową na żywo
John Qualis

Odpowiedzi:

6

Artykuł HTML 5 i wideo na iPada z własnej witryny internetowej , ostatnio zaktualizowane 12 listopada 2014 r., Zawiera następujące informacje:

wizerunek

W artykule zaleca się używanie MP4 jako dobrego rozwiązania z wystarczająco nową wersją ffmpeg, wykorzystującą kodowanie H.264 z AAC.

Sugeruję przeczytanie artykułu z dbałością o szczegóły: zawiera przykładowy plik HTML, który będzie działał na wszystkich głównych przeglądarkach, a także przykładowe polecenie FFmpeg służące do konwersji plików wideo na pliki .mp4, aby mogły być poprawnie przesyłane strumieniowo.

harrymc
źródło
czy chodzi o transmisję „na żywo”?
Markus Siebeneicher,
@MarkusSiebeneicher: Tak, głównie.
harrymc
Nadal mam problemy z „streamingiem” na żywo MP4 z ffmpeg, ponieważ wydaje się, że „nie można go zobaczyć”. Przesyłam dane wyjściowe ffmpeg bezpośrednio do przeglądarki, a webm działa od razu po wyjęciu z pudełka. Używając formatu MP4, mówi się, że nie można go zobaczyć ... Naprawdę zastanawiam się, co zrobić, aby MP4 „na żywo” mógł być przesyłany strumieniowo, w którym żadne wideo nie jest zapisywane bezpośrednio jako plik (co spowodowałoby, że byłby widoczny).
Markus Siebeneicher,
@MarkusSiebeneicher: Proponuję zadać to pytanie w nowym poście ze szczegółami.
harrymc