Использование нового Unity VideoPlayer и VideoClip API для воспроизведения видео
MovieTexture, наконец, устарел после Unity 5.6.0b1 релиз и новый API, который воспроизводит видео на настольных и мобильных устройствах теперь выпущен.
Видеоплеер и клип может использоваться для воспроизведения видео и получения текстуры для каждого кадра, если это необходимо.
мне удалось заставить видео работать, но coduldn't получить звук для воспроизведения, а также из редактора в Windows 10. Кто-нибудь знает, почему аудио не играет?
//Raw Image to Show Video Images [Assign from the Editor]
public RawImage image;
//Video To Play [Assign from the Editor]
public VideoClip videoToPlay;
private VideoPlayer videoPlayer;
private VideoSource videoSource;
//Audio
private AudioSource audioSource;
// Use this for initialization
void Start()
{
Application.runInBackground = true;
StartCoroutine(playVideo());
}
IEnumerator playVideo()
{
//Add VideoPlayer to the GameObject
videoPlayer = gameObject.AddComponent<VideoPlayer>();
//Add AudioSource
audioSource = gameObject.AddComponent<AudioSource>();
//Disable Play on Awake for both Video and Audio
videoPlayer.playOnAwake = false;
audioSource.playOnAwake = false;
//We want to play from video clip not from url
videoPlayer.source = VideoSource.VideoClip;
//Set video To Play then prepare Audio to prevent Buffering
videoPlayer.clip = videoToPlay;
videoPlayer.Prepare();
//Wait until video is prepared
while (!videoPlayer.isPrepared)
{
Debug.Log("Preparing Video");
yield return null;
}
Debug.Log("Done Preparing Video");
//Set Audio Output to AudioSource
videoPlayer.audioOutputMode = VideoAudioOutputMode.AudioSource;
//Assign the Audio from Video to AudioSource to be played
videoPlayer.EnableAudioTrack(0, true);
videoPlayer.SetTargetAudioSource(0, audioSource);
//Assign the Texture from Video to RawImage to be displayed
image.texture = videoPlayer.texture;
//Play Video
videoPlayer.Play();
//Play Sound
audioSource.Play();
Debug.Log("Playing Video");
while (videoPlayer.isPlaying)
{
Debug.LogWarning("Video Time: " + Mathf.FloorToInt((float)videoPlayer.time));
yield return null;
}
Debug.Log("Done Playing Video");
}
4 ответов
нашел проблему. Ниже находится основные код, который воспроизводит видео и аудио:
//Raw Image to Show Video Images [Assign from the Editor]
public RawImage image;
//Video To Play [Assign from the Editor]
public VideoClip videoToPlay;
private VideoPlayer videoPlayer;
private VideoSource videoSource;
//Audio
private AudioSource audioSource;
// Use this for initialization
void Start()
{
Application.runInBackground = true;
StartCoroutine(playVideo());
}
IEnumerator playVideo()
{
//Add VideoPlayer to the GameObject
videoPlayer = gameObject.AddComponent<VideoPlayer>();
//Add AudioSource
audioSource = gameObject.AddComponent<AudioSource>();
//Disable Play on Awake for both Video and Audio
videoPlayer.playOnAwake = false;
audioSource.playOnAwake = false;
//We want to play from video clip not from url
videoPlayer.source = VideoSource.VideoClip;
//Set Audio Output to AudioSource
videoPlayer.audioOutputMode = VideoAudioOutputMode.AudioSource;
//Assign the Audio from Video to AudioSource to be played
videoPlayer.EnableAudioTrack(0, true);
videoPlayer.SetTargetAudioSource(0, audioSource);
//Set video To Play then prepare Audio to prevent Buffering
videoPlayer.clip = videoToPlay;
videoPlayer.Prepare();
//Wait until video is prepared
while (!videoPlayer.isPrepared)
{
Debug.Log("Preparing Video");
yield return null;
}
Debug.Log("Done Preparing Video");
//Assign the Texture from Video to RawImage to be displayed
image.texture = videoPlayer.texture;
//Play Video
videoPlayer.Play();
//Play Sound
audioSource.Play();
Debug.Log("Playing Video");
while (videoPlayer.isPlaying)
{
Debug.LogWarning("Video Time: " + Mathf.FloorToInt((float)videoPlayer.time));
yield return null;
}
Debug.Log("Done Playing Video");
}
почему аудио не играл:
//Set Audio Output to AudioSource
videoPlayer.audioOutputMode = VideoAudioOutputMode.AudioSource;
//Assign the Audio from Video to AudioSource to be played
videoPlayer.EnableAudioTrack(0, true);
videoPlayer.SetTargetAudioSource(0, audioSource);
должен быть вызван перед videoPlayer.Prepare();
не после него. Это заняло несколько часов эксперимента, чтобы найти это, это была проблема, с которой я столкнулся.
застрял в "подготовке видео"?
подождите 5 секунд после videoPlayer.Prepare();
вызывается затем выйти из цикла while.
заменить:
while (!videoPlayer.isPrepared)
{
Debug.Log("Preparing Video");
yield return null;
}
С:
//Wait until video is prepared
WaitForSeconds waitTime = new WaitForSeconds(5);
while (!videoPlayer.isPrepared)
{
Debug.Log("Preparing Video");
//Prepare/Wait for 5 sceonds only
yield return waitTime;
//Break out of the while loop after 5 seconds wait
break;
}
это должно работать, но вы можете испытать буферизацию, когда видео начинает играть. При использовании этого временного исправления, мое предложение, чтобы файл для ошибки с названием " видеоплеер.isPrepared всегда true", потому что это ошибка.
некоторые человек также исправлено путем изменения:
videoPlayer.playOnAwake = false;
audioSource.playOnAwake = false;
to
videoPlayer.playOnAwake = true;
audioSource.playOnAwake = true;
Воспроизведение Видео С URL-адрес:
заменить:
//We want to play from video clip not from url
videoPlayer.source = VideoSource.VideoClip;
С:
//We want to play from url
videoPlayer.source = VideoSource.Url;
videoPlayer.url = "http://www.quirksmode.org/html5/videos/big_buck_bunny.mp4";
затем удалить:
public VideoClip videoToPlay;
и videoPlayer.clip = videoToPlay;
как это не нужен.
воспроизведение видео из папки StreamingAssets:
string url = "file://" + Application.streamingAssetsPath + "/" + "VideoName.mp4";
if !UNITY_EDITOR && UNITY_ANDROID
url = Application.streamingAssetsPath + "/" + "VideoName.mp4";
#endif
//We want to play from url
videoPlayer.source = VideoSource.Url;
videoPlayer.url = url;
все поддерживаемое видео форматы:
- ogv
- VP8 и аудиокодек
- формат WebM
- mov
- dv
- МР4
- m4v
- mpg
- в формате MPEG
дополнительные поддерживаемые форматы видео в Windows:
- avi
- asf
- wmf
некоторые из этих форматов не работать на некоторых платформах. Видеть этой сообщение для получения дополнительной информации о поддерживаемых видеоформатах.
похоже на то, что говорили другие ответы. Вы можете использовать обратные вызовы при подготовке и завершении состояний видео. Вместо использования сопрограмм и возврата.
videoPlayer.loopPointReached += EndReached;
videoPlayer.prepareCompleted += PrepareCompleted;
void PrepareCompleted(VideoPlayer vp) {
vp.Play();
}
void EndReached(VideoPlayer vp) {
// do something
}
я использовал ответ @Programmer для воспроизведения видео с URL-адреса, но я не мог получить никакого звука для воспроизведения. В конце концов я нашел ответ в комментарии учебника YouTube.
чтобы получить аудио для воспроизведения фильма, загруженного через URL, вам нужно добавить следующую строку перед вызовом EnableAudioTrack
:
videoPlayer.controlledAudioTrackCount = 1;
к настоящему времени Видеоплеер должен быть обновлен достаточно, вам не нужно писать код, чтобы правильно работать. Вот настройки, которые я нашел, чтобы иметь наиболее желаемый эффект:
эти параметры:
Видео-Плеер:
- Играть На Awake:правда
- Подождите Первого Кадра:False
- Режим Аудиовыхода: нет
Источник Звука:
- Играть На Awake:правда
Не забудьте иметь видеоклип для видеоплеера и аудиоклип для Аудиоисточника. Форматы файлов, которые я нашел для работы лучше всего .ogv для видео и .WAV для аудио.