1、问题
一个项目需要在linux下播放视频,并且视频在机器上,也就是要使用应用外的视频文件进行播放。
视频的格式当前提供的事avi格式,并且使用videoplayer 在windows下播放正常。
但是发出包之后再Ubuntu环境怎么都无法播放。
2、测试环境搭建
刚学unity没几天,为了帮忙解决这个问题,从来没用过videoplayer组件,这次需要搭建一个环境
2.1 创建一个Render texture
右键Assets文件夹或任意文件夹→Create→Render Texture纹理渲染
设置视频的分辨率,也就是视频的大小
2.2、创建image
直接创建一个raw image,并且将render texture 赋值给 Texture
增加videoplayer组件,并设置source为URL(因为要使用机器上的视频文件)
2.3、功能
为了方便控制,在界面上增加一个InputField 和 Text
Inputfield 用来输入路径
Text 显示路径
最终如下图
再写个控制脚本,挂载在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 猜测路径错误
最初猜测是路径错误导致的,查看官方文档
支持3种 :
- 应用内:这个不符合需求,没测试
- 本地地址,绝对地址,这个官方的例子file:///home/u1/abc.avi,播放不了,又测试了其他的格式,比如斜杠问题,路径放在附近等等,甚至改了访问权限。都不行!!!,心态崩了
- 线上地址,将视频放在了线上,依然不能播放,失败,http://localhost:9009/video1_F60.avi
3.2 格式问题
官方文档:视频文件兼容性 - Unity 手册
官方其实说的蛮清楚的,无奈啊,信息都在那,没有视频的知识不太懂。
折腾了一圈路径问题之后,又回到这个文档。
准备拿着给的视频文件转下编码试试
工具:安装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下居然能播放了,问题大概就算解决了。
4、其他的一些命令
这个命令会显示视频文件中第一个视频流的编码器。
ffprobe -v error -select_streams v:0 -show_entries stream=codec_name -of default=noprint_wrappers=1 <视频文件路径>
所谓的h264编解码,并不是直接将视频格式,通过h264编解码为视频原始数据流,这种说法是错误的,而是应该将视频格式转换为h264的数据流,然后对h264的数据流进行编解码,得到视频的原始数据流(也就是像素数据)
h264文件是压缩后的数据流文件
ffmpeg -i test.mp4 -c h264 test.h264
5、总结
1、知识背景很重要,没有知识背景,解决问题的办法放在那也不知道怎么解决
2、音视频的编码还是不太了解,需要学习下。
3、大胆猜测,小心求证