http://my.oschina.net/CgShare/blog/302303
Progressive Download (pseudo-streaming media)
Between the download local playback and live streaming media a form of play, download local playback must all download the file before playing, and progressive download does not have to wait until all the download is complete before playing, it can be downloaded while playing, after the completion of the content, the entire file will be saved on the phone.
Live Streaming media
Real-time streaming is the one side of the receiving packet playback, the local does not keep the file copy, live streaming is always real-time transmission, real-time live broadcast, support random access, users can fast forward or rewind to view the front or back of the content. Real-time streaming media transmission must ensure that the transmission speed of the packet is greater than the speed of the file, or the user will see a video pause. Video quality degrades when the network is plugged, so it's better to ensure that the quality of the video is progressively downloaded.
Real-time Streaming media protocol:
RTSP (Real time streaming Protocol)
MMS (Microsoft Media Server Protocol)
HLS (Http Live streaming)
Here is the main introduction of HLS,
HLS (HTTP Live streaming) is an HTTP-based streaming solution developed by Apple for mobile devices such as the iphone, IPod, itouch and ipad
https://developer.apple.com/streaming/
Technical key points
1. Capture data from video sources and audio sources
2. H264 encoding and AAC encoding of raw data
3. Video and audio data encapsulated as Mpeg-ts package
4.HLS segmentation Generation Strategy and m3u8 index file
5.HTTP Transport Protocol
Setting up HLS Streaming media server
Apache HTTP Server (Apple comes with)
Tomcat Web Server
IIS (Internet information Services)
Only Apache HTTP Server is recommended here
Open Terminal, vi/etc/apache2/httpd.conf
Under the <ifmodule mime_module>
Add two lines
AddType application/x-mpegurl.m3u8
AddType video/mp2t.ts
Perhaps you have insufficient authority, then use sudo chmod 777/etc/apache2/httpd.conf
Then vi/etc/apache2/httpd.conf
Restarting the server
sudo apachectl restart
==============================================
or build XMPP server or not set up, favorably get m3u8
==============================================
Create a project
Download library from git: Http://git.oschina.net/1213125967/HLS
Import a library into a project
Need to introduce a third party open source framework: asihttprequest,cocoahttpserver,m3u8
The system framework needs to be imported: Libsqlite3.dylib, Libz.dylib, Libxml2.dylib, Coretelephony.framework, Systemconfiguration.framework, Mobilecoreservices.framework, Security.framework, Cfnetwork.framework, mediaplayer.framework
Add/USR/INCLUDE/LIBXML2 to the library search path
Add header File
?
1234 |
#import <MediaPlayer/MediaPlayer.h> #import "M3U8Handler.h" #import "VideoDownloader.h" #import "HTTPServer.h" |
Declaring attributes:
?
12 |
@property (nonatomic, strong)HTTPServer * httpServer; @property (nonatomic, strong)VideoDownloader *downloader; |
Pre-play, Piscian set up the server
?
1234567891011121314151617181920212223 |
#pragma mark - 打开本地服务器
- (
void
)openHttpServer
{
self.httpServer = [[HTTPServer alloc] init];
[self.httpServer setType:@
"_http._tcp."
];
// 设置服务类型
[self.httpServer setPort:12345];
// 设置服务器端口
// 获取本地Documents路径
NSString *pathPrefix = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES) objectAtIndex:0];
// 获取本地Documents路径下downloads路径
NSString *webPath = [pathPrefix stringByAppendingPathComponent:kPathDownload];
NSLog(@
"-------------\nSetting document root: %@\n"
, webPath);
// 设置服务器路径
[self.httpServer setDocumentRoot:webPath];
NSError *error;
if
(![self.httpServer start:&error])
{
NSLog(@
"-------------\nError starting HTTP Server: %@\n"
, error);
}
}
|
When the building is finished, what is played depends on the needs
Stream Media Playback Online
?
123456 |
// 优酷视频m3u8新地址格式如下:http://pl.youku.com/playlist/m3u8?vid=XNzIwMDE5NzI4&type=mp4
// 如果上面的链接不可用,那么使用这个链接http://v.youku.com/player/getM3U8/vid/XNzIwMDE5NzI4/type/flv
NSURL *url = [[NSURL alloc] initWithString:@
"http://v.youku.com/player/getM3U8/vid/XNzIwMDE5NzI4/type/mp4"
];
MPMoviePlayerViewController *player = [[MPMoviePlayerViewController alloc] initWithContentURL:url];
[self presentMoviePlayerViewControllerAnimated:player];
|
Video download
?
1234567 |
M3U8Handler *handler = [[M3U8Handler alloc] init];
handler.delegate = self;
// 解析m3u8视频地址
[handler praseUrl:[NSString stringWithFormat:@
"http://pl.youku.com/playlist/m3u8?vid=XNzIwMDE5NzI4&type=mp4"
]];
// 开启网络指示器
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];
|
Play local video
?
12345678910111213141516171819202122 |
NSString * playurl = [NSString stringWithFormat:@
"http://127.0.0.1:12345/XNzIwMDE5NzI4/movie.m3u8"
];
NSLog(@
"本地视频地址-----%@"
, playurl);
// 获取本地Documents路径
NSString *pathPrefix = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES) objectAtIndex:0];
// 获取本地Documents路径下downloads路径
NSString *localDownloadsPath = [pathPrefix stringByAppendingPathComponent:kPathDownload];
// 获取视频本地路径
NSString *filePath = [localDownloadsPath stringByAppendingPathComponent:@
"XNzIwMDE5NzI4/movie.m3u8"
];
NSFileManager *fileManager = [NSFileManager defaultManager];
// 判断视频是否缓存完成,如果完成则播放本地缓存
if
([fileManager fileExistsAtPath:filePath]) {
MPMoviePlayerViewController *playerViewController =[[MPMoviePlayerViewController alloc]initWithContentURL:[NSURL URLWithString: playurl]];
[self presentMoviePlayerViewControllerAnimated:playerViewController];
}
else
{
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@
"Sorry"
message:@
"当前视频未缓存"
delegate:self cancelButtonTitle:@
"确定"
otherButtonTitles:nil, nil];
[alertView show];
}
|
Add Agent <M3U8HandlerDelegate,VideoDownloadDelegate>
?
12345678910111213141516171819202122232425262728293031323334 |
#pragma mark --------------视频解析完成----------------
-(
void
)praseM3U8Finished:(M3U8Handler*)handler
{
handler.playlist.
uuid
= @
"XNzIwMDE5NzI4"
;
self.downloader = [[VideoDownloader alloc]initWithM3U8List:handler.playlist];
[self.downloader addObserver:self forKeyPath:@
"totalprogress"
options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil];
self.downloader.delegate = self;
[self.downloader startDownloadVideo];
}
-(
void
)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(
void
*)context
{
NSLog(@
"下载进度 - %f"
, self.downloader.totalprogress);
}
#pragma mark --------------视频解析失败----------------
-(
void
)praseM3U8Failed:(M3U8Handler*)handler
{
NSLog(@
"视频解析失败-failed -- %@"
,handler);
}
#pragma mark --------------视频下载完成----------------
-(
void
)videoDownloaderFinished:(VideoDownloader*)request
{
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];
[request createLocalM3U8file];
NSLog(@
"----------视频下载完成-------------"
);
}
#pragma mark --------------视频下载失败----------------
-(
void
)videoDownloaderFailed:(VideoDownloader*)request
{
NSLog(@
"----------视频下载失败-----------"
);
|
iOS Streaming media