UnityアプリケーションをLinux環境で動作させる際のVideoPlayerの再生問題と解決手順

概要

Unityで開発したアプリケーションにおいて、Windows環境では問題なく動作していたVideoPlayerコンポーネントによる動画再生が、Ubuntu等のLinux環境へデプロイした際に動作しないというケースがあります。特に、アプリケーション外のローカルファイル(AVI形式など)を参照して再生する場合、パス指定やアクセス権限の問題に加え、Linux特有のサポート状況により再生が失敗することがあります。本記事では、その問題の特定から解決に至るまでの技術的なプロセスと、FFmpegを用いたコーデック変換による対処法について解説します。

検証環境の構築

問題を再現し検証するために、最小限のシーン構築を行います。まず、ビデオの出力先となるRender Textureを作成し、これをRaw Imageコンポーネントに割り当てます。

  • Render Textureの作成: Projectウィンドウで右クリックし、Create > Render Textureを選択します。解像度は再生対象の動画サイズに合わせて設定します。
  • UIの配置: Raw Imageを作成し、テクスチャに上記のRender Textureをアサインします。さらに、動画のパスを入力するためのInputFieldと再生トリガーとなるButtonを配置します。
  • VideoPlayerの設定: VideoPlayerコンポーネントを追加し、出力先(Target Texture)に作成したRender Textureを設定します。再生ソース(Source)は「URL」を選択し、ローカルファイルパスを指定できるようにします。

以下は、UI操作に応じて動画をロードし再生を行うC#スクリプトの実装例です。

using UnityEngine;
using UnityEngine.Video;
using UnityEngine.UI;

public class VideoLoader : MonoBehaviour
{
    [SerializeField] private VideoPlayer targetVideoPlayer;
    [SerializeField] private InputField pathInputField;
    [SerializeField] private Button loadButton;

    private void Start()
    {
        if (loadButton != null)
        {
            loadButton.onClick.AddListener(OnLoadButtonClicked);
        }
    }

    private void OnLoadButtonClicked()
    {
        if (targetVideoPlayer == null || pathInputField == null) return;

        string targetPath = pathInputField.text;
        if (string.IsNullOrEmpty(targetPath))
        {
            Debug.LogWarning("ビデオパスが入力されていません。");
            return;
        }

        Debug.Log($"再生試行: {targetPath}");
        targetVideoPlayer.url = targetPath;
        targetVideoPlayer.Play();
    }
}

トラブルシューティング:パス指定の検証

最初に疑うべきはファイルパスの指定形式です。UnityのVideoPlayerでは、ローカルファイルを指定する場合、絶対パスを使用する必要があります。

  • 絶対パス指定: file:///home/user/media/video.avi のようにURL形式を使用します。
  • アクセス権限: 実行ユーザーに対してファイルの読み取り権限があるか確認します。

Windows環境では正常に動作し、Linux環境でパス形式や権限を変更しても再生が成功しない場合、問題はパスやファイルシステムではなく、動画ファイル自体の形式(コーデック)にある可能性が高いです。また、Webサーバーに配置してHTTP経由で再生を試みた場合でも再生できない場合、同様にフォーマットの問題を疑うべきです。

原因特定:動画コーデックの非互換性

UnityのLinuxプレイヤーは、Windowsに比べてサポートされている動画コーデックが制限されています。AVIファイル自体はコンテナですが、内部で使用されているエンコーディング形式(コーデック)がLinux環境のUnityでサポートされていない場合、再生は失敗します。

この問題を解決するには、動画ファイルをLinux環境でサポートされている形式へ変換(トランスコード)する必要があります。一般的に推奨されるのは、WebM形式(VP8コーデック)への変換です。

解決策:FFmpegによるフォーマット変換

FFmpegを使用して、サポートされていないAVIファイルをVP8エンコードのWebMファイルへ変換します。以下のコマンドを実行することで、入力ファイルを再エンコードし、ビットレートと解像度を調整したWebMファイルを出力できます。

ffmpeg -i input_source.avi -c:v libvpx -b:v 1M -vf "scale=1280:720" output_target.webm
  • -c:v libvpx: VP8ビデオコーデックを使用する指定です。
  • -b:v 1M: ビデオのビットレートを1Mbpsに設定します。
  • -vf "scale=...": 動画の解像度を指定します。環境に応じて適宜変更してください。

変換されたoutput_target.webmファイルをUnityプロジェクトの外部参照パスに配置し、再びVideoPlayerから指定すると、Ubuntu環境下でも正常に再生されることが確認できます。

技術的な補足:コーデック確認

動画ファイルにどのようなコーデックが使用されているかを確認するには、ffprobeコマンドを使用します。これにより、ファイル内の最初のビデオストリームのエンコード名を特定できます。

ffprobe -v error -select_streams v:0 -show_entries stream=codec_name -of default=noprint_wrappers=1 target_video.avi

この情報をもとに、変換前のファイルがLinux環境で非サポートなコーデック(例えば特殊なAVI compression)を使用していないかを分析できます。動画再生の不具合は、しばしば「ファイルパスの問題」と誤解されがちですが、実際には「デコード能力の欠如」であることが多いため、システムアーキテクチャを理解した上での大胆な仮説と検証が重要です。

7月30日 08:02 投稿