次のコードを使用して、ユーザーに再生するビデオ ファイルを取得しようとしています。
public class VideoController : Controller
{
public VideoResult GetMP4Video(string videoID)
{
if (User.Identity.IsAuthenticated)
{
string clipLocation = string.Format("{0}\\Completed\\{1}.mp4", ConfigurationManager.AppSettings["VideoLocation"].ToString(), videoID);
using (FileStream stream = new FileStream(clipLocation, FileMode.Open))
{
FileStreamResult fsResult = new FileStreamResult(stream, "video/mp4");
VideoResult result = new VideoResult(ReadFully(fsResult.FileStream), "video/mp4");
return result;
}
}
else
{
return null;
}
}
private static byte[] ReadFully(Stream input)
{
byte[] buffer = new byte[32 * 1024];
using (MemoryStream ms = new MemoryStream())
{
int read;
while ((read = input.Read(buffer, 0, buffer.Length)) > 0)
{
ms.Write(buffer, 0, read);
}
return ms.ToArray();
}
}
}
クライアントに表示するために、私はメディア要素を使用しています:
<!-- Video Player Here -->
<video width="640" height="360" poster="@Url.Content(string.Format("~/Videos/{0}_2.jpg", Model.VideoID))" controls="controls" preload="none">
<!-- MP4 for Safari, IE9, iPhone, iPad, Android, and Windows Phone 7 -->
<source type="video/mp4" src="@Url.Action("GetMP4Video", "Video", new { videoID = Model.VideoID })" />
<!-- Flash fallback for non-HTML5 browsers without JavaScript -->
<object width="320" height="240" type="application/x-shockwave-flash" data="@Url.Content("~/Scripts/ME/flashmediaelement.swf")">
<param name="movie" value="@Url.Content("~/Scripts/ME/flashmediaelement.swf")" />
<param name="flashvars" value="controls=true&file=@Url.Action("GetMP4Video", "Video", new { videoID = Model.VideoID })" />
<!-- Image as a last resort -->
<img src="myvideo.jpg" width="320" height="240" title="No video playback capabilities" />
</object>
</video>
問題は、ファイルが再生されていないように見えるか、少なくとも一貫していないことです。また、ビデオのシークも適切に機能していないようです。私の質問は、これはビデオをユーザーに提供するための許容可能な方法ですか? もしそうなら、私は何が間違っていますか?私はビデオに非常に慣れていないことが重要だと思いますが、進むにつれて非常に学習しています。どんな助けでも大歓迎です。