I use an NSURLConnection to get a media file downloaded. While downloading I store the content at a NEMutableData and write it down to a cache file.
Now I want to play this file while downloading with AVPlayer (Not AVAudioPlayer) because it could be video.
At the time the AVPlayer get the URL to the cache file it looks like the player copy the state of the file because the player don't get any changes and after a few seconds it holds because of the end of data.
Does anybody has a better solution but to download everything first until start playing, or is there a way to give the AVPlayer an Internet NSURL and preload the rest while streaming?
Related
I have a big MP4 video file in Dropbox. Is there a way to start playing that while downloading in iOS?
Thanks
Use an NSURLConnection to async download the content of the video URL into a local file and after a certain fraction has been downloaded (approx. 2 MB), play the file. NSURLConnection with connection:didReceiveData delegate method does the job
i'm using AFNetworking to download media files. Audio and Video. I use AFDownloadRequestOperation to get a better way to pause and resume large downloads.
i found lots of tutorials for download and for stream media but i need a way to start download and play the unfinished download from disk to get a better experience while playing large files.
does anybody know how to do this?
As Player i use AVPlayer with AVPlayerItem and AVAsset
if there is another way without this 3 Objects it would be great.
We've got an app we're working on that needs to provide playback of video files via AVPlayer. The files need to be stored on the user's device, but also must playback while downloading.
At the moment we've built a download module that uses the ASIHTTPRequest library to get the video files via PHP (we don't want the media to be linkable via public URLs) and write them to disk asynchronously.
We've then setup an AVPlayer as per the AV Foundation Programming Guide, getting the file with AVURLAsset, making an AVPlayerItem with the asset, building the AVPlayer with the item, then setting the player to an AVPlayerLayer. The player runs fine with a fully downloaded video file and will also run a progressively downloaded file perfectly well in the simulator.
Unfortunately on an actual device, the behavior of the player changes, where instead it seemingly loads the video once and doesn't attempt to grab new packets from disk. The result is that the player will play video and audio up to the point in the video that marks where the download progress was at the time the asset was loaded (e.g. if 2MB of data are buffered then the player is created, the player will only play up to the 2MB worth of data). Because it has the video's header, the player will happily continue thinking it's playing for the full duration of the video, but no other video is rendered to screen.
The last wrinkle is that if the video is inserted into an AVComposition and the AVPlayer is created with that, the progressive video will play fine. This would be a fine solution (and is necessary for our app anyway on occasion) except that the client for our app requires that the video be playable on an Apple TV via AirPlay, which AVCompositions are incapable of.
Does anyone know if there is a way to play progressively downloading video files using an AVPlayer built from AVURLAssets? Is there a way to force the player/playerItem to read from disk with an AVURLAsset the way it seems to do with an AVComposition instead of seemingly caching the video in memory?
Thanks!
I haven't a solution to just make it work wit AVURLAssets but I use a slightly different approach. We bundle our App with CocoaHTTPServer and play video files which aren't fully downloaded trough a HTTP request against the local server.
The server knows the total length of the file and can then decide by looking at the HTTP-Headers which part of the file is request and either loads it from disk or from remote source.
While developing this there where always 3 initial requests, one for the first two bytes of the file, one of a larger chunk from the beginning of the file and one chunk directly of the end of the file. That's why it was always needed to load at least the last part directly from the remote server since the player would need it right from the start. I would guess the same happens for local files so the player loads the last bytes from the file (which aren't the right last bytes) and won't play over that length.
You would have to subclass HTTPConnection and make your own HTTPResponse class by looking at the provided "HTTPAsyncFileResponse".
I hope this gives you an idea how to accomplish this with a different approach.
I'm assigned to implement a iphone app that can download video files from a server, and to play that video while the video file is written to the disk; something likes
(Movie player)<--read--[###### iphone flaskdisk ######]<--write---(Downloader)
I know that I would use HTTP video streaming play a remote video stream, but what i need is the video file is saved in flask mem after playing.
Any suggestion?
Thanks
If you know how to play a video from a URL, you can easily play the video while simultaneously download the video on another thread (if you are short on time)...
Alternatively, you can create your own video player that handles this function. Application sin the App Store do already do this (check out any video downloader application)
Thanks!
I am trying to get the MPMovieplayerController to play incomplete video files. I want to use this so a user can download a part of a movie and play it offline. I am using ASIHTTP so i can resume downloads, if i try to play the temporary the player does nothing and and i get no errors. Also i registered for the MPMoviePlayerContentPreloadDidFinishNotification notification but it does not get dispatched. When the file is done downloading i can play it correctly.
Is it possible to somehow play incomplete video files? Alternatives to MPMovieplayerController are also welcome if that offers a solution.
I needed to download the first part op the mp4 file and the last part before i was able to play the video. So i am now downloading the first mb of the file then the last mb then the middle part and now i can play the file while it is not complete.