2014-06-11 9 views
15

Aktualnie wysyłam strumień wideo do Chrome, aby odtwarzać go za pomocą MediaSource API.Kodowanie FFMPEG do MPEG-DASH - lub WebM z klatkami kluczowymi - dla MediaSource API

Jak rozumiem, MediaSource obsługuje tylko pliki MP4 zakodowane z MPEG-DASH, lub pliki WebM, które mają klastry zaczynające się od klatek kluczowych (w przeciwnym razie powoduje to błąd: segment multimediów nie zaczął się od klatki kluczowej).

Czy istnieje sposób na kodowanie w formatach MPEG-DASH lub keyframed WebM za pomocą FFMPEG w czasie rzeczywistym?

Edit:

prostu próbowałem go ffmpeg ... -f webm -vcodec vp8 -g 1 tak, że każda klatka jest klatką. Nie jest to idealne rozwiązanie. Teraz działa z MediaStream. Jakikolwiek sposób synchronizacji segmentów z klatkami kluczowymi w WebM, więc nie każda klatka musi być klatką kluczową?


Pytania odniesienie WebM/MP4 i MediaSource:

Media Source Api not working for a custom webm file (Chrome Version 23.0.1271.97 m)

MediaSource API and mp4

Odpowiedz

11

W momencie FFMPEG nie obsługuje kodowanie Dash. Możesz segmentować za pomocą FFMPEG (https://www.ffmpeg.org/ffmpeg-formats.html#segment_002c-stream_005fsegment_002c-ssegment), ale polecam połączenie FFMPEG i MP4Box. Użyj FFMPEG do transkodowania wideo na żywo, a następnie MP4Box do segmentowania i tworzenia indeksu .mpd.

MP4Box jest częścią GPAC (http://gpac.wp.mines-telecom.fr/).

Oto przykład za pomocą h264:

ffmpeg -threads 4 -f v4l2 -i /dev/video0 -acodec libfaac -ar 44100 -ab 128k -ac 2 -vcodec libx264 -r 30 -s 1280x720 -f mp4 -y "$movie" > temp1.mp4 && MP4Box -dash 10000 -frag 1000 -rap "$movie" 

Jeśli potrzebujesz WebM (VP8), użyj: -vcodec libvpx i -f webm lub -f ts.

+0

Dzięki Cibráne. Czy MP4Box może kodować potok w czasie rzeczywistym? Chcemy uzyskać transmisję na żywo o małym opóźnieniu. Jakakolwiek dalsza porada byłaby ogromnie doceniona! Czy istnieje sposób na strumieniowe przesyłanie WebM bezpośrednio z FFMPEG z klatkami kluczowymi w każdym klastrze? –

+0

Tak, możesz użyć MP4Box do segmentowania Live Video. Pomysł jest tutaj: http://www.slideshare.net/cconcolato/live-streaming-of-video-and-subtitles-with-mpegdash Dla sgementer jest ten sam segment pracy VP8 lub H264. –

+1

Czy to jest wciąż aktualne? Wygląda na to, że jest teraz przynajmniej ograniczona obsługa DASH. https://www.ffmpeg.org/ffmpeg-formats.html#webm_005fdash_005fmanifest – Brad

6

Aby osiągnąć bardzo niską latencję i uniknąć konieczności segmentu wideo, można nadal korzystać z WebM z:

ffmpeg ... -f webm -vcodec vp8 -g 1 ... 

To gwarantuje, że każda klatka jest klatką kluczową, (poprzez ustawienie grupy obrazów do 1).

Edit:

Inny użytkownik miał trochę szczęścia:

ffmpeg ... \ 
    -f mp4 \ 
    -reset_timestamps 1 \ 
    -movflags empty_moov+default_base_moof+frag_keyframe \ 
    -probesize 200000 

proszę zobaczyć zobaczyć pytania galbarm pod adresem:

Uwaga: Jeśli nie masz klatek kluczowych na wideo wejściowego, być może trzeba ustawić:

-frag_duration 100000 

... zamiast +frag_keyframe.

+0

Myślę, że ta (oryginalna) odpowiedź może nadal być naprawdę przydatna dla niektórych osób, które wykonują ultra-niską latencję w czasie rzeczywistym na parze, więc idę zostawić to tutaj na razie. Jeśli uważasz, że ta odpowiedź nie jest opcją, daj mi znać, a ja ją usunę. (Lub, jeśli masz lepsze rozwiązanie do przesyłania strumieniowego o zerowym opóźnieniu, opublikuj go!) –

4

wpadłem na tej samej sytuacji, kiedy próbujesz odtworzyć nagrany plik .webm przez MediaRecorder API tyłu używając Media Source Extensions (MSE). Nagrania Chrome (51) są zniekształcone, Firefox (46) wydaje się być w porządku.

żeby działało trzeba naprawić repliki w .webm pliku:

  1. klonu https://github.com/webmproject/libwebm
  2. upewnij się że masz wersję cmake> = 3,2 (https://askubuntu.com/questions/610291/how-to-install-cmake-3-2-on-ubuntu-14-04)
  3. cmake .
  4. make
  5. ./sample_muxer -i original.webm -o fixed.webm
  6. załaduj fixed.webm do DA SH/twój własny gracz!

Mam nadzieję, że pomógł komuś. Znalezienie informacji bez słowa kluczowego DASH było dość trudne (nie używam DASH, tylko ta sama technologia podstawowa - MSE) :)

+0

Możesz także skompilować bibliotekę libwebm pod Windows przy użyciu Visual Studio. To działa jak urok. – lukyer

1

Aby upewnić się, że każda grupa w twoim WebM zaczyna się od klatki kluczowej, wypróbuj coś takiego:

ffmpeg \ 
    [...inputs] \ 
    -vcodec libvpx \ 
    -keyint_min 60 \ 
    -g 60 \ 
    -vb 4000k \ 
    -f webm \ 
    -cluster_size_limit 10M \ 
    -cluster_time_limit 2100 \ 
    [...output] 

Zasadniczo, jak zaimplementowano, każda klatka kluczowa musi znajdować się na początku klastra, ale odwrotność nie jest prawdą. Oznacza to, że na klatce kluczowej będzie nowy klaster, ale w nowej grupie niekoniecznie będzie klatka kluczowa. Aby obejść ten problem, po prostu ustawiliśmy rozmiar klastra na duży, którego nigdy nie trafimy.

W tym przykładzie będziemy mieć klatkę kluczową co 2 sekundy, a limit czasu klastra to 2,1 sekundy, więc nigdy go nie klikniemy. Bitrate to 4Mbit, a limit wielkości klastra to 10M-coś. Nie jestem pewien, czy jest to bit lub bajt, ale nie ma to znaczenia, ponieważ nigdy go nie trafimy, ponieważ ustawiłem go znacznie lepiej niż powinien.

Powiązane problemy