我正在使用iOS 7,我有一个.mp4视频,我需要在我的应用程序中下载.视频很大(约1 GB),这就是为什么它不包含在应用程序中的原因.我希望用户能够在开始下载后立即开始观看视频.我还希望视频能够在iOS设备上缓存,以便用户以后不需要再次下载.播放视频的常规方法(渐进式下载和实时流式传输)似乎都不允许您缓存视频,因此我创建了自己的Web服务,将视频文件分块并将字节流式传输到客户端.我使用NSURLConnection启动流式HTTP调用:
self.request = [[NSMutableURLRequest alloc] initWithURL:self.url];
[self.request setTimeoutInterval:10]; // Expect data at least every 10 seconds
[self.request setHTTPMethod:@"GET"];
self.connection = [[NSURLConnection alloc] initWithRequest:self.request delegate:self startImmediately:YES];
Run Code Online (Sandbox Code Playgroud)
当我收到数据块时,我将它附加到文件的本地副本的末尾:
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
NSFileHandle *handle = [NSFileHandle fileHandleForWritingAtPath:[self videoFilePath]];
[handle truncateFileAtOffset:[handle seekToEndOfFile]];
[handle writeData:data];
}
Run Code Online (Sandbox Code Playgroud)
如果我让设备运行,文件下载成功,我可以使用MPMoviePlayerViewController播放它:
NSURL *url=[NSURL fileURLWithPath:self.videoFilePath];
MPMoviePlayerViewController *controller = [[MPMoviePlayerViewController alloc] initWithContentURL:url];
controller.moviePlayer.scalingMode = MPMovieScalingModeAspectFit;
[self presentMoviePlayerViewControllerAnimated:controller];
Run Code Online (Sandbox Code Playgroud)
但是,如果我在文件完全下载之前启动播放器,则视频开始播放就好了.它甚至可以在顶部擦洗条上显示正确的视频长度.但是当用户到达视频中我在视频开始之前完成下载的位置时,视频就会挂起.如果我关闭并重新打开MPMoviePlayerViewController,那么视频会播放,直到它到达我再次启动MPMoviePlayerViewController时的任何位置.如果我等到整个视频下载完毕,那么视频播放没有问题.
我没有收到任何事件,或者在发生这种情况时打印到控制台的错误消息(视频启动后永远不会发送MPMoviePlayerPlaybackStateDidChangeNotification和MPMoviePlayerPlaybackDidFinishNotification).似乎还有其他东西告诉控制器视频的长度是什么,而不是洗涤器使用的...
有谁知道可能导致这个问题的原因是什么?我不一定要使用MPMoviePlayerViewController,所以如果在这种情况下使用不同的视频播放方法,我就是为了它.
相关未解决的问题:
使用AVURLAssets进行AVPlayer和逐行视频下载
更新1 我发现视频停顿确实是因为视频开始播放时的文件大小.我可以通过在开始下载之前创建一个归零文件来解决这个问题,并在我去的时候覆盖它.由于我可以控制视频流服务器,因此我添加了一个自定义标头,因此我知道正在流式传输的文件的大小(流式文件的默认文件大小标头为-1).我在didReceiveResponse方法中创建文件,如下所示:
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
// Retrieve the size …Run Code Online (Sandbox Code Playgroud) video-streaming progressive-download mpmovieplayer ios nsurlsessiondownloadtask
我有一个在iphone(sdk 4)中实现的音乐播放器,它可以与Mp3(即时转码)或原始渐进式下载一起使用.
反正有没有让渐进式下载的内容(我不直接控制)被缓存,所以它不会重新下载整个内容?
或者是否需要控制全局缓存设置?(另一方面,我使用ASIHTTP API联系我的HTTP服务器并访问允许缓存的数据).
提前致谢.
我们正在开发一款需要通过AVPlayer播放视频文件的应用.文件需要存储在用户的设备上,但也必须在下载时播放.
目前我们已经构建了一个下载模块,该模块使用ASIHTTPRequest库通过PHP获取视频文件(我们不希望媒体可以通过公共URL链接)并将它们异步写入磁盘.
然后我们根据AV Foundation Programming Guide设置AVPlayer ,使用AVURLAsset获取文件,使用资产制作AVPlayerItem,使用项目构建AVPlayer,然后将播放器设置为AVPlayerLayer.播放器在完全下载的视频文件中运行正常,并且还可以在模拟器中完美地运行逐步下载的文件.
不幸的是,在实际设备上,播放器的行为发生了变化,相反,它似乎只加载了一次视频而不会尝试从磁盘中获取新的数据包.结果是播放器将视频和音频播放到视频中的点,该点标记了资源加载时下载进度的位置(例如,如果缓冲了2MB的数据,则创建播放器,播放器将仅播放2MB的数据).因为它有视频的标题,播放器会很高兴地继续认为它在视频的整个持续时间内播放,但没有其他视频呈现在屏幕上.
最后一个问题是,如果将视频插入AVComposition并使用该视频创建AVPlayer,则渐进式视频将正常播放.这将是一个很好的解决方案(无论如何我们的应用程序都是必需的),除了我们的应用程序的客户端要求视频可以通过AirPlay在Apple TV上播放,AVCompositions无法播放.
有没有人知道是否有办法使用AVURLAssets构建的AVPlayer逐步下载视频文件?有没有办法强制播放器/ playerItem使用AVURLAsset从磁盘读取,就像它看起来像AVComposition一样,而不是看似在内存中缓存视频?
谢谢!
我正在尝试使用http和固定大小的mp3文件为iPhone实现渐进式下载音频播放器.
我找到了AudioStreamer项目,但它似乎非常复杂,并且在无尽的流中效果最佳.
我需要能够找出音频文件的总长度,我还需要能够在文件中查找.我发现了对AudioStreamer的黑客攻击,但它似乎对我来说效果不佳.http://www.saygoodnight.com/?p=14
我想知道是否有更简单的方法来实现我的目标,或者是否有更好的工作样本?我找到了低音库,但没有太多关于它的文档.
/ Br Johannes
我从第三方网站获得了以下来源,解释了如何使用互联网下载文件WinInet.我对API并不太熟悉,我看了一下该WinInet单元,但没有看到任何API调用,就像我需要的那样.
我正在做的是添加报告下载文件进度的功能.这个程序我已经包含在一个内部,TThread一切正常.但是,只缺少一个:在下载之前查找源文件的总大小.
请参阅下面我有评论的地方//HOW TO GET TOTAL SIZE?这是我需要在开始下载之前找出文件总大小的位置.我该怎么做呢?因为这个代码在下载之前似乎不知道文件的大小 - 这使得这个添加无关紧要.
procedure TInetThread.Execute;
const
BufferSize = 1024;
var
hSession, hURL: HInternet;
Buffer: array[1..BufferSize] of Byte;
BufferLen: DWORD;
f: File;
S: Bool;
D: Integer;
T: Integer;
procedure DoWork(const Amt: Integer);
begin
if assigned(FOnWork) then
FOnWork(Self, FSource, FDest, Amt, T);
end;
begin
S:= False;
try
try
if not DirectoryExists(ExtractFilePath(FDest)) then begin
ForceDirectories(ExtractFilePath(FDest));
end;
hSession:= InternetOpen(PChar(FAppName), INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
try
hURL:= InternetOpenURL(hSession, PChar(FSource), nil, …Run Code Online (Sandbox Code Playgroud) 我想从基线Jpeg图像转换为渐进式Jpeg图像.
我的磁盘中存储了10,000张图像.
我尝试了一个网站,但它正在改变一个网站.http://www.imgonline.com.ua/eng/compress-image.php
但是我想要批量转换它们.
有没有在线工具或一些编程技巧?
然后,让我知道.
谢谢.
从网上下载图像并在UIImageView中显示它是相当容易的.但是,这需要在向用户显示图像之前完全下载图像,从而完全击败渐进式JPEG(和PNG)图像.
如何在传输过程中渲染部分下载的图像?我会想象SDK有一些回调函数可以更新图像,但我找不到这样的功能.使用当前的iOS SDK是否可行?
我知道,与mp4中,moov atom必须放置在文件的开头,使渐进式下载.这可以通过在创建文件时启用"faststart"来完成.
我很好奇在处理webm或ogg文件时是否有任何类似的要求,或者它们是否"默认为渐进式下载"?
我想知道我们是否可以将相同的文件用于视频流和渐进式下载.他们的编码有什么不同吗?
例如,如果我有.flv文件,我是否可以使用相同的文件进行上述任何交付方法,而无需进行任何进一步操作?
任何人都可以建议任何描述如何实现渐进式下载的教程或文章吗?
我正在尝试在我的iOS应用程序中实现可以通过AVPlayer播放的视频的渐进式下载.我已经实现了一个下载器模块,可以将文件下载到iPad.但是,我发现我无法播放仍在写入的文件
所以,据我所知,我唯一的解决方案是通过下载文件'chunks'的列表,然后在准备好(即:下载)时继续播放每个文件,可能使用HLS
搜索我遇到过这个问题,通过hls实现渐进式下载,但除此之外,我找不到别的办法
但是,我不断遇到搜索结果,说明如何配置Web服务器以利用iOS支持HTTP Progressive Downloading,但没有提到如何从iOS端执行此操作
那么,任何人对此都有任何想法和/或经验吗?
编辑:我还发现可能有一种方法可以通过其他方式(即:流式传输,然后将流式数据写入磁盘)这个问题提出但仍然无法使其工作,因为它似乎无法使用非本地资产!
avfoundation video-streaming progressive-download ios avplayer
ios ×4
avplayer ×2
iphone ×2
jpeg ×2
audio-player ×1
avfoundation ×1
avurlasset ×1
caching ×1
delphi ×1
delphi-xe2 ×1
download ×1
image ×1
ogg ×1
png ×1
progressive ×1
uiimageview ×1
video ×1
webm ×1
wininet ×1