C++ ときどき ごはん、わりとてぃーぶれいく☆

USAGI.NETWORKのなかのひとのブログ。主にC++。

WebRTC on Linux with Google Chrome is FAIL!

WebRTCからvideoへgetUserMediaから映像ストリームを流したかった、それもこれからやろうと思った事の序章として。

始めに私が陥ったミスは先のエントリーの通り。つまりopenSUSE-12.2のreposのChromium-24がvideo要素すらサポートしていない状態だった事。これはGoogle版のChromeを導入する事で解決した。確かにvideo要素は動き、YouTubeで素晴らしい音楽をvideoタグで鑑賞できた。

しかし、次の問題は唖然とせざるを得なかった。WebRTCの簡単なサンプルを書いた。

<!DOCTYPE html>

<video
  id="v"
  autoplay
  controls
>
</video>

<script>
  navigator.getUserMedia
    =  navigator.getUserMedia
    || navigator.webkitGetUserMedia
    || navigator.mozGetUserMedia
    || navigator.msGetUserMedia
    ;
    
  console.log
    ( 'navigator.getUserMedia is '
    + (navigator.getUserMedia ? '[OK]' : '[n/a]')
    );
  
  window.URL
    =  window.URL
    || window.webkitURL
    ;
  
  console.log
    ( 'window.URL is '
    + (window.URL ? '[OK]' : '[n/a]')
    );

  navigator.getUserMedia
    ( { video   : true
      , toString: function() { return 'video'; }
      }
    , function(s) {
        var v = document.getElementById('v')
        v.src = window.URL.createObjectURL ? window.URL.createObjectURL(s) : s;
        console.log('begin video stream');
      }
    , function(e)
      { console.log('[ERROR] ' + e); }
    );
</script>

しかし上手く動作しない。開発者ツールのコンソールにもエラーは出ていない。chrome://flags/についてもChrome23ではWebRTCについて必要なフラグは最早無くなって居る(Chrome21からgetUserMediaに関するフラグは必要無い)。

それどころか、ウェブ上に存在するWebRTCから映像ストリームを取得する誰かしらのデモすらも動作しない。例えば、

などだ。

さて、こうなるとそろそろ疑うべきは…ChromeのWebRTCの映像ストリーム機能はLinux向けにまともに実装されているのか?」だ。

結論を見せよう。

% google-chrome
 ...
[112:114:1202/011047:ERROR:capture_video_decoder.cc(64)] Not implemented reached in virtual void CaptureVideoDecoder::OnStarted(media::VideoCapture*)

ChromiumLinuxで実行された時、標準出力、標準エラー出力をコンソールに接続される。どう見てもChromiumC++ソースコードレベルで未実装だ。Linux向けの特殊化が実装されていない。なんという事だ…。