VLCのステレオプレーヤー

画像 それはすべて、3D対応のASUS VG23AHを搭載した新しいモニターを購入したという事実から始まりました。ある時点で、3D映画を鑑賞する機会を得たいと思いました。 Mac OS用の無料のプレーヤーを探しましたが、それほど多くはありませんでした。ほとんどの場合、 Binoプレーヤーが出くわしました。 このBinoをダウンロードしましたが、正常に動作しませんでした。 プレーヤーへの苦情はありません。写真は3Dでしたが、ビデオはひどく遅く、写真はひきつりました。 私はこのプログラムのパフォーマンスを改善するためのアドバイスを取りました-それは言う-VLCプレーヤーでこの映画がどのように再生されるかを確認してください。 VLCでは、すべてがブレーキなしで完全に表示されましたが、もちろん、モノラルモードで表示されました。 VLCはオープンソースプロジェクトであるため、ステレオムービーを表示できるように少し調整することにしました。



始めるために、私はこのリポジトリを分岐し、ドキュメントとハウツーを読み始めました。 私はすぐにプロジェクトをビルドできませんでした。インストールされたMacポートと競合があり、それを破壊しなければなりませんでした。 次に、エクストラ/ツール/ ragel / aaplコンポーネントのアップマージを実行する必要がありました。その後、 指示に従ってすべてを組み立てました。

それから私が最初に思い付いたのは、VLCにプラグインを追加できることでした(これらはデコードされたフレームの後処理を行うことができるモジュールです)。 それでは、ステレオイメージを変換するにはこれで十分だと思いました。



余談:私が再生したいソースファイルは、各ビデオフレームに2つの角度(左目用の左画像、右用の右画像)が一般的で、ステレオムービーのかなり標準的な形式でした。



処理は、左半分と右半分のフレームからそれぞれ1行ずつ出力ビデオバッファーを形成するという事実に縮小されました。 左目は奇数ライン、右目は偶数ラインを見ると予想されていました。

このフィルターを実装するのは簡単でした(説明を読み、既存のフィルターの1つを基礎として使用しました)。 しかし、もちろん、これは成功につながりませんでした。 画面では、画像は縞模様に見えましたが、線は画面のピクセルと同期していなかったため、メガネに3D効果はありませんでした。



余談:パッシブ3Dモニターで3Dモードがどのように機能するかを説明します。 私はこの技術の専門家ではないので、アマチュアとして説明します。

私のようなモニターは、FPR(Film-type Patterned Retarder)テクノロジーを使用してビデオストリームを分割します。 モニターのピクセルの各ラインが偏光フィルターで覆われていると想像してください。奇数ラインは垂直偏光のフィルターで閉じられ、偶数ラインは水平であり、同じフィルターはメガネであり、その結果、片方の目は奇数のものしか見えません行、2番目の偶数。



これを理解したので、出力ビデオフレームの位置をピクセル単位で保証できるように、レンダリングで直接後処理を行う必要があることに気付きました。



VLC for Macでレンダリングがどのように実装されているかを見ました。 それは非常に簡単でした。 デコードされた各ビデオフレームはテクスチャとして読み込まれ、続いてオープンGLを使用して画面に表示されます。 グラフィック形式のYUVからRBGへの変換は、ピクセルシェーダーで直接行われます。 これはすぐに私が考えることを促しました-何をする必要があります。 ピクセルシェーダーは画面の各ピクセルの色を形成するだけであることがわかっているため、このシェーダーを修正して、色を形成するときに偶数行と奇数行のテクスチャの右部分からデータを取得できるようにします。



サンプルコードを次に示します(回路図に記載されています。実際の例はこちらをご覧ください )。



void main(void) { vec4 x,y,z,result; vec4 tc = TexCoord0; + float d = mod((floor(height*(tc.y+1.0))),2.0); //odd or even, height - is new uniform to get viewport height + if(d>0.1) tc.x += 0.5; //shift texture x = texture2D(Texture0, tc.st); y = texture2D(Texture1, tc.st); z = texture2D(Texture2, tc.st); result = x * Coefficient[0] + Coefficient[3]; //Coefficient - const coefficients for convert YUV to RGB result = (y * Coefficient[1]) + result; result = (z * Coefficient[2]) + result; + if(TexCoord0.x > 0.5) result = vec4(0,0,0,1); //cut off right side gl_FragColor = result; };
      
      







ソースコードと比較した場合、+でマークされた行のみを追加しました。



その後、画面の左側で正しいステレオ画像を受信しました。

将来的には、画像のサイズを調整し、右側を切り取るだけです。これでステレオプレーヤーの準備は完了です。

興味のある方-githubでコードを見ることができます。



実際、合計でVLCからステレオプレーヤーを取得するために、約30行のコードを記述する必要があり、それが非常に印象的であり、この記事を書く理由になりました。



PS:後に、私のバージョンが作られたとき、優れたオープンソースのステレオプレーヤーsview.ruが見つかりました。これはMacOSで正常に動作します。



All Articles