使用Media Player Framework在iPhone模拟器中播放视频

时间:2012-01-31 11:49:11

标签: objective-c ios media-player

如果有帮助的话,我会在下面给出我的全部代码.....

#import "ContentViewController.h"
#import "ContentViewController.h"
#import "MediaPlayerViewController.h"
#import "TwitterViewController.h"
#import "YoutubeViewController.h"

@implementation ContentViewController

@synthesize imageView;
@synthesize imageView1;
@synthesize tableView;
@synthesize navigationController;
@synthesize toolBar;
@synthesize item;

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
  self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
  if (self) {
    // Custom initialization
  }
return self;
}

- (void)didReceiveMemoryWarning
{
  // Releases the view if it doesn't have a superview.
   [super didReceiveMemoryWarning];

  // Release any cached data, images, etc that aren't in use.
}

#pragma mark - XMLParser Delegate

-(void)parseXMLFileAtURL:(NSString *)URL{

NSURL *xmlURL = [NSURL URLWithString:URL];
rssParser = [[NSXMLParser alloc]initWithContentsOfURL:xmlURL];
[rssParser setDelegate:self];
[rssParser setShouldProcessNamespaces:NO];
[rssParser setShouldReportNamespacePrefixes:NO];
[rssParser setShouldResolveExternalEntities:NO];
[rssParser parse];
NSLog(@"Parsed");
}

-(void)parserDidStartDocument:(NSXMLParser *)parser{

NSLog(@"Found file and started parsing");
}

-(void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError{

NSString *errorString = [NSString stringWithFormat:@"Unable to download feed from website (Error Code %i)",  [parseError code]];
NSLog(@"Error parsing xml: %@", errorString);
UIAlertView *errorAlert = [[UIAlertView alloc]initWithTitle:@"Error loading content" message:errorString delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
[errorAlert show];
}

-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{

  currentElement = [elementName copy];
   if ([elementName isEqualToString:@"channel"]) {

    rssElement      = [[NSMutableDictionary alloc]init];

    title           = [[NSMutableString alloc]init];
    link            = [[NSMutableString alloc]init];
    description     = [[NSMutableString alloc]init];
    copyright       = [[NSMutableString alloc]init];
  } 
}


-(void)parser: (NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{

    if ([elementName isEqualToString:@"channel"]) {

    [rssElement setObject:title                 forKey:@"title"];
    [rssElement setObject:link                  forKey:@"link"];
    [rssElement setObject:description           forKey:@"description"];
    [rssElement setObject:copyright             forKey:@"copyright"];

    [item addObject:[rssElement copy]];
    NSLog(@"adding stories %@", title);
  }
}


-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{

  if ([currentElement isEqualToString:@"title"]) {
    [title appendString:string];
  }else if ([currentElement isEqualToString:@"link"]) {
    [link appendString:string];
  }else if ([currentElement isEqualToString:@"description"]) {
    [description appendString:string];
  }else if ([currentElement isEqualToString:@"copyright"]) {
    [copyright appendString:string];
  }
}

-(void)parserDidEndDocument:(NSXMLParser *)parser{

NSLog(@"all done");
NSLog(@"item array has %d items", [item count]);
[tableView reloadData];
NSLog(@"Finished Parsing");
}

#pragma mark - View lifecycle

- (void)viewDidLoad
{
  [super viewDidLoad];
  // Do any additional setup after loading the view from its nib.

/* Add Segmented Controller */

if (segmentedControl == nil) {
    segmentedControl = [[UISegmentedControl alloc] initWithItems:
                        [NSArray arrayWithObjects:@"Video", @"Images", @"Audio", nil]];
}


[segmentedControl setFrame:CGRectMake(55.0, 47.0, 180.0, 31.0)];
[segmentedControl setSegmentedControlStyle:UISegmentedControlStyleBar];
[segmentedControl setWidth:70.0 forSegmentAtIndex:0];
[segmentedControl setWidth:70.0 forSegmentAtIndex:1];
[segmentedControl setWidth:70.0 forSegmentAtIndex:2];
[segmentedControl addTarget:self 
                     action:@selector(segmentClick:) 
           forControlEvents:UIControlEventValueChanged];
[segmentedControl setMomentary:YES];

//    [[[segmentedControl subviews]objectAtIndex:0]setTintColor:[UIColor blackColor]];

[self.view addSubview:segmentedControl];

/* Add Image View */

imageView1.image = [UIImage imageNamed:@"Harry.png"];

/* Add Page Control */

pageControl = [[UIPageControl alloc] init];
pageControl.frame = CGRectMake(120.0, 250.0, 100.0 ,10.0);
pageControl.numberOfPages = 5;
pageControl.currentPage = 0;

[self.view addSubview:pageControl];

/* Customize Table View */

tableView.backgroundColor = [UIColor clearColor];
imageView.image = [UIImage imageNamed:@"gradientBackground.png"];

item = [[NSMutableArray alloc]init];

if ([item count] == 0) {

    path = @"http://172.19.58.172/Android/GetApprovedList.php?ip=172.19.58.172&type=Video";
    [self parseXMLFileAtURL:path];
    [tableView reloadData];
    NSLog(@"Returned %@", item);
}

headerLabel = [[UILabel alloc]initWithFrame:CGRectMake(10.0, 270.0, 300.0, 14.0)];
headerLabel.text = @"Latest Videos";
headerLabel.textColor = [UIColor whiteColor];
headerLabel.backgroundColor = [UIColor clearColor];

[self.view addSubview:headerLabel];
}

/* Assign control to Segment Controller */

-(void)segmentClick:(UISegmentedControl *)segmentControl {

if (segmentControl.selectedSegmentIndex == 1){


    if ([item count] == 0) {

        path = @"http://172.19.58.172/Android/GetApprovedList.php?ip=172.19.58.172&type=Image";
        [self parseXMLFileAtURL:path];
        [tableView reloadData];
        headerLabel.text = @"Latest Images";
        NSLog(@"Returned %@",item);
    }
}
else if (segmentedControl.selectedSegmentIndex == 2){
    if ([item count] == 0) {

        path = @"http://172.19.58.172/Android/GetApprovedList.php?ip=172.19.58.172&type=Audio";
        [self parseXMLFileAtURL:path];
        [tableView reloadData];
        headerLabel.text = @"Latest Audios";
        NSLog(@"Returned no items");
        //            [[[segmentedControl subviews]objectAtIndex:2]setTintColor:[UIColor blackColor]];
    }
}
else {
    if ([item count] == 0) {

        path = @"http://172.19.58.172/Android/GetApprovedList.php?ip=172.19.58.172&type=Video";
        [self parseXMLFileAtURL:path];
        [tableView reloadData];
        headerLabel.text = @"Latest Videos";
        NSLog(@"Returned %@", item);
    }        
    //        [[[segmentedControl subviews]objectAtIndex:0]setTintColor:[UIColor blackColor]];
  }
}

#pragma mark Table View Data Source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
   NSLog(@"this is returned %@", item);
return item.count;
}

- (UITableViewCell *)tableView:(UITableView *)aTableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{

static NSString *CellIdentifier = @"Cell";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease];
}

int feed = [indexPath indexAtPosition:[indexPath length] - 1];
cell.textLabel.text = [[item objectAtIndex:feed]objectForKey:@"title"];
cell.detailTextLabel.text = [[item objectAtIndex:feed]objectForKey:@"description"];
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
return cell;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{

NSString *moviePath = [self.item objectAtIndex:indexPath.row];
NSURL *movieURL = [NSURL fileURLWithPath:moviePath];
NSLog(@"Item has %@", movieURL);
playerController = [[MPMoviePlayerController alloc]initWithContentURL:movieURL];
[playerController play];

//    MediaPlayerViewController *mediaView = [[MediaPlayerViewController  alloc]initWithNibName:@"MediaPlayerViewController" bundle:nil];
//    [self presentModalViewController:mediaView animated:YES];

}

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{

    if (buttonIndex == 0) {
    shareAlert = [[UIActionSheet alloc]initWithTitle:@"Share to" delegate:self cancelButtonTitle:@"Cancel"     
 destructiveButtonTitle:@"Facebook" otherButtonTitles:@"Twitter", nil];
    [shareAlert showInView:self.view];
  }
  else if (buttonIndex == 1){
    NSLog(@"button 2");
  }
}

- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex{
if (buttonIndex == 1) {
    TwitterViewController *twitterController = [[TwitterViewController alloc]initWithNibName:@"TwitterViewController" bundle:nil];
    [self presentModalViewController:twitterController animated:YES];

  }
}

-(void)moviePlayBackDidFinish:(NSNotification *)notification{
MPMoviePlayerController *moviePlayerController = [notification object];
[moviePlayerController.view removeFromSuperview];
[moviePlayerController release];
}

- (void)viewDidUnload
{
  [super viewDidUnload];
  // Release any retained subviews of the main view.
  // e.g. self.myOutlet = nil;
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
  // Return YES for supported orientations
  return (interfaceOrientation == UIInterfaceOrientationPortrait);
}

@end

更改了didSelectRow方法,如下所示:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{

moviePath = [[item objectAtIndex:indexPath.row]objectForKey:@"link"];
NSLog(@"moviepath has %@", moviePath);
movieURL = [NSURL URLWithString:moviePath];
NSLog(@"movieURL has %@", movieURL);
viewController = [[MPMoviePlayerViewController alloc]initWithContentURL:movieURL];
[self presentMoviePlayerViewControllerAnimated:viewController];

viewController.moviePlayer.movieSourceType = MPMovieSourceTypeStreaming;
[playerController play];
viewController = nil; 

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(moviePlayBackDidFinish:)
                                             name:MPMoviePlayerPlaybackDidFinishNotification
                                           object:viewController];

}

- (void) moviePlayBackDidFinish:(NSNotification*)notification {

viewController = [notification object];

[[NSNotificationCenter defaultCenter] removeObserver:self      
                                                name:MPMoviePlayerPlaybackDidFinishNotification
                                              object:viewController];

if ([viewController respondsToSelector:@selector(setFullscreen:animated:)])
{
    [viewController.view removeFromSuperview];
}

}

现在,在选择任何一行时,一个空白屏幕即将到来,应用程序就会卡在那里。视频无法播放

对此方面的任何帮助表示赞赏。

提前致谢。

3 个答案:

答案 0 :(得分:0)

通过查看代码,我可以告诉您的是,您不必重新分配您的项目对象。

如果您已在类中的某个位置分配了item对象并将值存储在其中,则不要像在此处那样重新分配它:

item = [[NSMutableArray alloc]init];
NSString *moviePath = [item objectAtIndex:indexPath.row];

通过重新分配它,你正在为它分配一个新的内存,而在新的内存中没有任何对象存在。

答案 1 :(得分:0)

您正在通过以下方式为阵列分配新内存:item = [[NSMutableArray alloc]init];。它现在意味着NO个对象。并且您正试图通过NSString *moviePath = [item objectAtIndex:indexPath.row];访问它,而indexPath.row处没有任何对象,这就是它崩溃的原因。

答案 2 :(得分:0)

播放视频的代码实际上没有任何问题。错误发生在用于解析和检索rss feed的代码中,这最终给了我错误的视频名称。因此,视频没有播放。

解析代码为Parsing attributes with same name but in different fields in iOS