Форум программистов, компьютерный форум CyberForum.ru

Objective-C

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 4.94
aply
0 / 0 / 0
Регистрация: 19.11.2013
Сообщений: 40
#1

Воспроизведение музыки из интернета сразу после нажатия кнопки - Objective-C

14.05.2014, 14:46. Просмотров 1965. Ответов 10
Метки нет (Все метки)

Для воспроизведения песни в браузере использую GET запрос к сервису.
Браузер, в частности гугл хром, начинает сразу её воспроизводить и показывает количество загруженного.
Как сделать такое же в IOS ?
Пробую через AVAudioPlayer и NSURLSessionDownloadTask, но это не то - песня начинает звучать только после полного скачивания.
Как заставить звучать сразу? При этом желательно еще и кэшировать в Library/Cache.

Вот метод, который пытаюсь использовать:
Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
-(void) playWithTrackItem:(NSDictionary *)trackItem
{
    NSString *fileName = [[trackItem[@"default"] stringValue] stringByAppendingString:@".tmp"];
    NSData *trackData =[NSData dataWithContentsOfFile:[cachesDirectory stringByAppendingPathComponent:fileName]];
    if (trackData) {
        dispatch_async(dispatch_get_main_queue(), ^{
            player = [[AVAudioPlayer alloc] initWithData:trackData error:nil];
            [player play];
        });
    } else {
        
        NSString *urlString = [MAINURL stringByAppendingFormat:@"api/tracks/%@/listen/2?token=%@", [trackItem[@"default"] stringValue],[XMSession sharedInstance].token];
        NSURL *url = [NSURL URLWithString:[urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
        
        NSLog(@"url=%@",url);
        
        NSURLRequest *request = [NSURLRequest requestWithURL:url];
        NSURLSessionDownloadTask *downloadTask =
        [session downloadTaskWithRequest:request completionHandler:^(NSURL *location, NSURLResponse *response, NSError *error) {
            if (!error){
                NSError *error1;
                NSURL *trackCacheURL = [NSURL fileURLWithPath:[cachesDirectory stringByAppendingPathComponent:fileName]];       
                NSFileManager *fileManager = [NSFileManager defaultManager];
                if ([fileManager moveItemAtURL:location
                                         toURL:trackCacheURL
                                         error: &error1])
                {
                    NSLog(@"File is saved to =%@",cachesDirectory);
                    dispatch_async(dispatch_get_main_queue(), ^{
                        player = [[AVAudioPlayer alloc] initWithData:[NSData dataWithContentsOfURL:trackCacheURL] error:nil];
                        [player play];
                    });
                    
                } else {
                    NSLog(@"failed to move: %@",[error1 userInfo]);
                }
            }
        }];
        [downloadTask resume];
    }
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
glvrzzz
95 / 71 / 12
Регистрация: 12.12.2012
Сообщений: 214
14.05.2014, 15:36     Воспроизведение музыки из интернета сразу после нажатия кнопки #2
Попробуйте AVPlayer
noname_club
102 / 90 / 9
Регистрация: 01.05.2013
Сообщений: 581
14.05.2014, 17:27     Воспроизведение музыки из интернета сразу после нажатия кнопки #3
не все так просто

через AVPlayer оно запуститься это да. Но стоит экрану погаснуть и воспроизведение прекратится.

Вот класс который позволяется проигрывать звуки в фоновом режиме.

SimpleAudioClass.h
Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
//
//  SimpleAudioClass
//
//  Created by admin on 16.09.13.
//  Copyright (c) 2013 admin. All rights reserved.
//
 
// класс работы звука в фоновом режиме
 
// используется конфигурация в *info.plist приложения
 
// Required background modes->App Plays Audio
// UIBackgroundModes -> audio
 
// использование
 
// [SimpleAudioClass AudioSessionDisable];
// [SimpleAudioClass AudioSessionActivate];
 
// либо проигырвать через методы (играет через втроенный плеер)
// playFile
// play
// stop
// pause
// сессия будет включаться по необходимости
 
// v2.1
 
// - добавлено отключение аудио сессии
 
// v2.2
 
#import <Foundation/Foundation.h>
#import <AVFoundation/AVFoundation.h>
#import <QuartzCore/QuartzCore.h>
 
#define avmode_stop 0
#define avmode_pause 2
#define avmode_play 1
 
#define SimpleAudioClass [TSimpleAudioClass getInstance]
 
@interface TSimpleAudioClass : NSObject<AVAudioPlayerDelegate>
 
+(TSimpleAudioClass*) getInstance;
 
-(BOOL) AudioSessionDisable;
-(BOOL) AudioSessionActivate;
 
@property bool AutoEnableAudioSession;
 
@property (readonly) int mode;
 
@property AVPlayer *av_player;
@property AVAudioPlayer *av_localplayer;
@property (weak,nonatomic) AVPlayerLayer *av_videoLayer;
 
-(void) playFile: (NSString*) file;
-(void) playFile: (NSString*) file
          inView: (UIView*) view;
-(void) play;
-(void) stop;
-(void) pause;
 
@property NSTimer *sysTimer;
 
@property (assign,nonatomic) NSTimeInterval playTime;
@property (readonly,nonatomic) NSTimeInterval fullTime;
@property (assign,nonatomic) double volume;
 
@property (readonly) double av_volume;
 
@property NSTimer *sessionTimer;
@property bool session_mode;
 
@end
Тестовый проект

Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#import "ViewController.h"
 
@interface ViewController ()
 
@end
 
@implementation ViewController
 
- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
}
 
- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}
 
- (IBAction)play:(id)sender {
    [SimpleAudioClass playFile:@"http://radiosilver.corbina.net:8000/silver48.mp3"];
}
- (IBAction)pause:(id)sender {
    [SimpleAudioClass pause];
}
- (IBAction)stop:(id)sender {
    [SimpleAudioClass stop];
}
 
@end
Вложения
Тип файла: zip test_SimpleAudioClass.zip (40.2 Кб, 36 просмотров)
noname_club
102 / 90 / 9
Регистрация: 01.05.2013
Сообщений: 581
14.05.2014, 17:29     Воспроизведение музыки из интернета сразу после нажатия кнопки #4
При этом желательно еще и кэшировать в Library/Cache.
Кешировать можно, но только паралельно проигрывая. То есть будет 2 потока скачивания.

Один на проигрывание. А второй тем временем скачивает.

SimpleAudioClass может проигрывать локальные файлы через тот же самый метод playFile:

если передать туда строковый абсолютный путь к файлу.
aply
0 / 0 / 0
Регистрация: 19.11.2013
Сообщений: 40
15.05.2014, 10:03  [ТС]     Воспроизведение музыки из интернета сразу после нажатия кнопки #5
А он может начать проигрывать сразу? Мне не столько важно в фоне, сколько то, чтоб воспроизведение началось сразу, постепенно закачивая песню.
noname_club
102 / 90 / 9
Регистрация: 01.05.2013
Сообщений: 581
15.05.2014, 11:45     Воспроизведение музыки из интернета сразу после нажатия кнопки #6
А он может начать проигрывать сразу?
Objective-C
1
[SimpleAudioClass playFile:@"http://radiosilver.corbina.net:8000/silver48.mp3"];
сразу после этой команды начинает играть, как только получает необъодимые данные.
aply
0 / 0 / 0
Регистрация: 19.11.2013
Сообщений: 40
15.05.2014, 11:54  [ТС]     Воспроизведение музыки из интернета сразу после нажатия кнопки #7
Т.е. как скачает всю песню?
noname_club
102 / 90 / 9
Регистрация: 01.05.2013
Сообщений: 581
15.05.2014, 13:14     Воспроизведение музыки из интернета сразу после нажатия кнопки #8
Т.е. как скачает всю песню?
нет , как только будет готов, так сразу и запуститься. Там внутри обычный AVPlayer. Смысл этого класса в том что он сам запускает АудиоСесию для фонового режима звука.
aply
0 / 0 / 0
Регистрация: 19.11.2013
Сообщений: 40
15.05.2014, 15:25  [ТС]     Воспроизведение музыки из интернета сразу после нажатия кнопки #9
Попробовал, вроде то, что надо. Сейчас в коде разбираться буду, чтоб внедрить к себе)
Спасибо!
aply
0 / 0 / 0
Регистрация: 19.11.2013
Сообщений: 40
20.05.2014, 14:00  [ТС]     Воспроизведение музыки из интернета сразу после нажатия кнопки #10
В продолжение темы, не подскажете, можно ли передавать управление воспроизведением аудио во встроенный проигрыватель IOS 7?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.10.2014, 23:37     Воспроизведение музыки из интернета сразу после нажатия кнопки
Еще ссылки по теме:

Objective-C Нарисовать линию по клику кнопки
Изменить программно название кнопки Objective-C
Objective-C Воспроизведение аудио из памяти используя AVAydioPlayer
Objective-C Контроллер не ловит событие нажатия
Objective-C Останавливается воспроизведение

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
dr_OX
0 / 0 / 0
Регистрация: 09.07.2013
Сообщений: 12
22.10.2014, 23:37     Воспроизведение музыки из интернета сразу после нажатия кнопки #11
Цитата Сообщение от noname_club Посмотреть сообщение
Кешировать можно, но только паралельно проигрывая. То есть будет 2 потока скачивания.

Один на проигрывание. А второй тем временем скачивает.
AVAudioPlayer может проигрывать неполные файлы с диска телефона, у меня только что получилось.
Выходит, можно делать так:
1) По нажатию на "play" начать качать или продолжать докачивать mp3 в файл на телефон. Это я уже реализовал связкой NSUrlConnection + NSFileHandle.
2) Плеер запускать не сразу, а когда загрузится определённое количество байт (это количество можно указать просто как константу, а можно и динамически рассчитать оптимальное значение для текущего соединения).
3) Если плеер заткнётся по истечении нехватки загруженных данных, его следует остановить и снова ждать, пока не подгрузится нужный кусок, или файл не загрузится целиком.

Вообщем, я буду пробовать реализовать этот механизм, препятствий пока не вижу.
Пишу этот проект на Swift-е.
Yandex
Объявления
22.10.2014, 23:37     Воспроизведение музыки из интернета сразу после нажатия кнопки
Ответ Создать тему
Опции темы

Текущее время: 05:11. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru