深圳自适应网站的公司,有谁知道哪个网址,企业网站设计制作收费,网站优化怎么样做介绍
在实际的开发过程中#xff0c;需要在应用内部内嵌播放器进行视频的播放。官方默认的MediaElement控件只能播放有限的视频格式#xff0c;也不能播放网络流。比较流行的解决方式是vlc的库#xff0c;但是在实际使用过程中发现有很多问题。这里给大家推荐另一个比较好的…介绍
在实际的开发过程中需要在应用内部内嵌播放器进行视频的播放。官方默认的MediaElement控件只能播放有限的视频格式也不能播放网络流。比较流行的解决方式是vlc的库但是在实际使用过程中发现有很多问题。这里给大家推荐另一个比较好的库。
使用
官网地址
安装库
Nuget下安装FFME.Windows
PM Install-Package FFME.Windows下载ffmpeg依赖
注官网给的地址我在实际使用中发现使用官方的代码没问题使用给定的步骤使用就会抱错如果你们跟我一样给大家推荐另一个ffmpeg包的地址 ffmpeg依赖下载地址
代码
指定ffmpeg库的地址
Unosquare.FFME.Library.FFmpegDirectory C:\ffmpeg\ffmpeg-4.4-windows-desktop-vs2022-gpl-lite\bin;xaml中插入控件
Window x:ClassWpfApp1.MainWindowxmlnshttp://schemas.microsoft.com/winfx/2006/xaml/presentationxmlns:xhttp://schemas.microsoft.com/winfx/2006/xamlxmlns:dhttp://schemas.microsoft.com/expression/blend/2008xmlns:mchttp://schemas.openxmlformats.org/markup-compatibility/2006xmlns:localclr-namespace:WpfApp1 xmlns:ffmeclr-namespace:Unosquare.FFME;assemblyffme.winmc:IgnorabledLoadedWindow_LoadedClosedWindow_ClosedTitleMainWindow Height300 Width600Gridffme:MediaElement x:NameMedia BackgroundGray LoadedBehaviorPlay UnloadedBehaviorManual /Button ContentPlay ClickPlayButton_Click HorizontalAlignmentLeft VerticalAlignmentTop Width75 Margin10/Button ContentStop ClickStopButton_Click HorizontalAlignmentLeft VerticalAlignmentTop Width75 Margin100,10,0,0//Grid
/Window
监听失败的事件
Media.MediaFailed OnMediaFailed;创建一个处理流地址的类FileInputStream
namespace Unosquare.FFME.Windows.Sample.Foundation;using Common;
using FFmpeg.AutoGen;
using System;
using System.IO;
using System.Runtime.InteropServices;/// inheritdoc /
/// summary
/// Provides an example of a very simple custom input stream.
/// /summary
/// seealso crefIMediaInputStream /
public sealed unsafe class FileInputStream : IMediaInputStream
{private readonly FileStream BackingStream;private readonly object ReadLock new();private readonly byte[] ReadBuffer;/// summary/// Initializes a new instance of the see crefFileInputStream/ class./// /summary/// param namepathThe path./parampublic FileInputStream(string path){var fullPath Path.GetFullPath(path);BackingStream File.OpenRead(fullPath);var uri new Uri(fullPath);StreamUri new Uri(uri.ToString().ReplaceOrdinal(file://, Scheme));CanSeek true;ReadBuffer new byte[ReadBufferLength];}/// summary/// The custom file scheme (URL prefix) including the :// sequence./// /summarypublic static string Scheme customfile://;/// inheritdoc /public Uri StreamUri { get; }/// inheritdoc /public bool CanSeek { get; }/// inheritdoc /public int ReadBufferLength 1024 * 16;/// inheritdoc /public InputStreamInitializing OnInitializing { get; }/// inheritdoc /public InputStreamInitialized OnInitialized { get; }/// inheritdoc /public void Dispose(){BackingStream?.Dispose();}/// summary/// Reads from the underlying stream and writes up to paramref nametargetBufferLength / bytes/// to the paramref nametargetBuffer /. Returns the number of bytes that were written./// /summary/// param nameopaqueThe opaque./param/// param nametargetBufferThe target buffer./param/// param nametargetBufferLengthLength of the target buffer./param/// returns/// The number of bytes that have been read./// /returnspublic int Read(void* opaque, byte* targetBuffer, int targetBufferLength){lock (ReadLock){try{var readCount BackingStream.Read(ReadBuffer, 0, ReadBuffer.Length);if (readCount 0)Marshal.Copy(ReadBuffer, 0, (IntPtr)targetBuffer, readCount);else if (readCount 0)return ffmpeg.AVERROR_EOF;return readCount;}catch (Exception){return ffmpeg.AVERROR_EOF;}}}/// inheritdoc /public long Seek(void* opaque, long offset, int whence){lock (ReadLock){try{return whence ffmpeg.AVSEEK_SIZE ?BackingStream.Length : BackingStream.Seek(offset, SeekOrigin.Begin);}catch{return ffmpeg.AVERROR_EOF;}}}
}
播放视频
//var target new Uri(rtmp://127.0.0.1/live/test1231233);
var target new Uri(D:\视频\泥坑.mp4);
if (target.ToString().StartsWith(FileInputStream.Scheme, StringComparison.OrdinalIgnoreCase))await Media.Open(new FileInputStream(target.LocalPath));
elseawait Media.Open(target);