Форум программистов, компьютерный форум, киберфорум
Наши страницы
Objective-C
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/12: Рейтинг темы: голосов - 12, средняя оценка - 4.83
aply
0 / 0 / 0
Регистрация: 19.11.2013
Сообщений: 40
1

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

14.05.2014, 14:46. Просмотров 2173. Ответов 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];
    }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.05.2014, 14:46
Ответы с готовыми решениями:

Повторное воспроизведение музыки после кнопки home (media-player)
Собственно, погуглил, и нашел, что у всех обратная проблема - "как остановить...

Видеоплеер, воспроизведение видео только после нажатия кнопки
Для воспроизведения видео использую плеер flowplayer. как сделать чтобы после...

WPF блокирование кнопки сразу же после нажатия
Подскажите пожалуйста как сделать кнопку не активной сразу же после нажатия, и...

Воспроизведение музыки из интернета
Добрый день, есть задачка такого рода: по ссылке...

Нужно после нажатия кнопки сразу же на странице обновить данные
Покажите на простом примере, нужен статус почти как у Дурова. Надеюсь все знают...

10
glvrzzz
95 / 71 / 12
Регистрация: 12.12.2012
Сообщений: 214
14.05.2014, 15:36 2
Попробуйте AVPlayer
0
noname_club
106 / 97 / 12
Регистрация: 01.05.2013
Сообщений: 603
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
1
Вложения
Тип файла: zip test_SimpleAudioClass.zip (40.2 Кб, 38 просмотров)
noname_club
106 / 97 / 12
Регистрация: 01.05.2013
Сообщений: 603
14.05.2014, 17:29 4
При этом желательно еще и кэшировать в Library/Cache.
Кешировать можно, но только паралельно проигрывая. То есть будет 2 потока скачивания.

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

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

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

Воспроизведение музыки после перемотки
Ребята,всем привет. Большая просьба подсказать, как мне продолжить...

Не запускается комп: индикатор возле кнопки Пуск на системнике зажегся только во время нажатия кнопки. После - не горит.
Просьба к форумчанам помочь в решении проблеммы. Сегодня вдруг отрубился комп...

Анимация в 2D срабатывает не сразу после нажатия клавиши
Привет, Я только начал знакомиться с 2D анимацией в Unity. Проблема в том,...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru