1、问题

一个项目需要在linux下播放视频,并且视频在机器上,也就是要使用应用外的视频文件进行播放。

视频的格式当前提供的事avi格式,并且使用videoplayer 在windows下播放正常。

但是发出包之后再Ubuntu环境怎么都无法播放。

2、测试环境搭建

刚学unity没几天,为了帮忙解决这个问题,从来没用过videoplayer组件,这次需要搭建一个环境

2.1 创建一个Render texture

右键Assets文件夹或任意文件夹→CreateRender Texture纹理渲染

Unity 安卓播放不了 mp4 unity无法播放_unity

设置视频的分辨率,也就是视频的大小

Unity 安卓播放不了 mp4 unity无法播放_linux_02

2.2、创建image

直接创建一个raw image,并且将render texture 赋值给 Texture

增加videoplayer组件,并设置source为URL(因为要使用机器上的视频文件)

Unity 安卓播放不了 mp4 unity无法播放_linux_03

2.3、功能

为了方便控制,在界面上增加一个InputField 和 Text

Inputfield 用来输入路径

Text 显示路径

最终如下图

Unity 安卓播放不了 mp4 unity无法播放_Unity 安卓播放不了 mp4_04

再写个控制脚本,挂载在Canvas

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.Serialization;
using UnityEngine.UI;
using UnityEngine.UIElements;
using UnityEngine.Video;
using Button = UnityEngine.UI.Button;

public class PlayerVideo : MonoBehaviour
{
    // Start is called before the first frame update

    public Button PlayBtn;

    public VideoPlayer vp;

     public InputField inputField;

     public Text text;
    void Start()
    {
        PlayBtn.onClick.AddListener(() =>
        {
            Application.Quit();
        });
        
        inputField.onEndEdit.AddListener(editFinish);
    }

    public void editFinish(string call)
    {
        var textText = inputField.text;
        
        Debug.Log("-------->"+ textText);

        text.text = textText;
        
        playVideo();
    }
    public void playVideo()
    {
        vp.url = inputField.text;
        vp.Play();
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}

3、解决问题

3.1 猜测路径错误

最初猜测是路径错误导致的,查看官方文档

视频源 - Unity 手册

Unity 安卓播放不了 mp4 unity无法播放_游戏_05

支持3种 :

  • 应用内:这个不符合需求,没测试
  • 本地地址,绝对地址,这个官方的例子file:///home/u1/abc.avi,播放不了,又测试了其他的格式,比如斜杠问题,路径放在附近等等,甚至改了访问权限。都不行!!!,心态崩了
  •  线上地址,将视频放在了线上,依然不能播放,失败,http://localhost:9009/video1_F60.avi

3.2 格式问题

官方文档:视频文件兼容性 - Unity 手册

Unity 安卓播放不了 mp4 unity无法播放_游戏_06

官方其实说的蛮清楚的,无奈啊,信息都在那,没有视频的知识不太懂。

折腾了一圈路径问题之后,又回到这个文档。

准备拿着给的视频文件转下编码试试

工具:安装ffmpeg,不记得什么时候装的了,只记得装过,想不到今天派上用场了。

转为VP8:

ffmpeg -i input.mp4 -c:v libvpx -b:v 1M -vf "scale=640:360" output.webm

这会将输入视频文件(input.mp4)重新编码为VP8编码的WebM格式(output.webm)。-c:v libvpx选项告诉FFmpeg使用VP8编码器。-b:v 1M指定视频的目标比特率为1 Mbps,设置视频分辨率为640x360。你可以根据需要调整这个值。

将这个视频放到Ubuntu下居然能播放了,问题大概就算解决了。

Unity 安卓播放不了 mp4 unity无法播放_unity_07

4、其他的一些命令

这个命令会显示视频文件中第一个视频流的编码器。

ffprobe -v error -select_streams v:0 -show_entries stream=codec_name -of default=noprint_wrappers=1 <视频文件路径>

Unity 安卓播放不了 mp4 unity无法播放_unity_08

所谓的h264编解码,并不是直接将视频格式,通过h264编解码为视频原始数据流,这种说法是错误的,而是应该将视频格式转换为h264的数据流,然后对h264的数据流进行编解码,得到视频的原始数据流(也就是像素数据)

h264文件是压缩后的数据流文件

ffmpeg -i test.mp4 -c h264 test.h264

5、总结

1、知识背景很重要,没有知识背景,解决问题的办法放在那也不知道怎么解决

2、音视频的编码还是不太了解,需要学习下。

3、大胆猜测,小心求证