I'm currently working on a xamarin.android project, and am attempting to upload a video to an aws server, and then also be able to play it back. The upload is working correctly as far as I can tell.
I'm retrieving the file from the user's phone, tuing it into a byte array, and uploading that. This is the code to upload:
if (isImageAttached || isVideoAttached)
{
//upload the file
byte[] fileInfo = System.IO.File.ReadAllBytes(filePath);
Task<Media> task = client.SaveMediaAsync(fileInfo, nameOfFile);
mediaObj = await task;
//other code below is irrelevant to example
}
and SaveMediaAsync is a function I wrote in a PCL:
public async Task<Media> SaveMediaAsync(byte[] fileInfo, string fName)
{
Media a = new Media();
var uri = new Uri(RestUrl);
try
{
MultipartFormDataContent form = new MultipartFormDataContent();
form.Add(new StreamContent(new MemoryStream(fileInfo)), "file", fName); //add file
var response = await client.PostAsync(uri, form); //post the form client is an httpclient object
string info = await response.Content.ReadAsStringAsync();
//save info to media object
string[] parts = info.Split('"');
a.Name = parts[3];
a.Path = parts[7];
a.Size = Int32.Parse(parts[10]);
}
catch(Exception ex)
{
//handle exception
}
retu a;
}
After uploading the video like that, I'm able to view it in a browser using the public url. The quality is the same, and there is no issue with lag or load time. However when I try to play back the video using the same public url on an android device, it takes an unbelievably long time to load the video. Even once it is loaded, it plays less than a second of it, and then seems to start loading the video again(the part of the progress bar that shows how much of the video has loaded jumps back to the current position and starts loading again).
VideoView myVideo = FindViewById<VideoView>(Resource.Id.TestVideo);
myVideo.SetVideoURI(Android.Net.Uri.Parse(url));
//add media controller
MediaController cont = new MediaController(this);
cont.SetAnchorView(myVideo);
myVideo.SetMediaController(cont);
//start video
myVideo.Start();
Now I'm trying to play a 15 second video that is 5.9mb. When I try to play a 5 second video that's 375kb it plays with no issue. This leads me to believe I need to make the video file smaller before playing it back, but I'm not sure how to do that. I'm trying to allow the user to upload their own videos, so I'll have all different file formats and sizes.
I've seen some people suggesting ffmpeg for a c# way to alter video files, but I'm not quite sure what it is I need to do to the video file. Can anyone fill in the gaps in my knowledge here?
Thanks for your time, it's greatly appreciated!
