概要
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)を使用していないかを分析できます。動画再生の不具合は、しばしば「ファイルパスの問題」と誤解されがちですが、実際には「デコード能力の欠如」であることが多いため、システムアーキテクチャを理解した上での大胆な仮説と検証が重要です。