2013-12-27 4 views
0

В примере jukebox.c из libspotify я подсчитываю все кадры текущего трека в обратном вызове music_delivery. Когда end_of_track называется количеством кадров, каждый раз, когда я играл на той же дорожке. Таким образом, end_of_track вызывается через несколько секунд после окончания песни. И этот временной интервал отличается для каждого воспроизведения.Разное количество кадров для одного и того же трека

Как определить, действительно ли песня действительно закончена? Должен ли я взять продолжительность песни в секундах и умножить ее на частоту дискретизации, чтобы позаботиться о том, когда песня закончилась?

Почему больше кадров доставлено, чем необходимо для дорожки? И почему end_of_track не вызывается на его реальном конце? Или я чего-то не хватает?

ответ

0

end_of_track вызывается, когда libspotify закончил доставку аудио кадров для этой дорожки. Это не информация о воспроизведении - каждая реализация воспроизведения, которую я видел, хранит внутренний буфер между libspotify и звуковым драйвером.

В зависимости от того, где вы рассчитываете, это будет учитывать разницу, которую вы видите. Поскольку аудиокод находится за пределами libspotify, вам нужно следить за тем, что на самом деле происходит со звуковым драйвером, и остановить воспроизведение, перейти к следующему треку или независимо от того, что вам нужно сделать соответствующим образом. end_of_track в основном там, чтобы вы знали, что вы можете закрыть любые выходные потоки, которые у вас есть, от обратного вызова доставки к вашему звуковому коду или что-то в этом направлении.

+0

Я рассчитываю только в обратном вызове 'music_delivery' не в реализации звукового драйвера. Я добавляю каждый параметр num_frames к глобальной переменной и печатаю его в 'end_of_track'. Интересно, почему каждый раз, когда я транслирую один и тот же трек, количество кадров отличается. Когда продолжительность песни равна, например, 3:10, чем общее количество отсчетов, должно быть всегда одинаковым, учитывая, что частота выборки одинакова. – dnlkng

+0

Является ли это причиной других проблем, кроме смены счетчика? Существует ряд условий, которые могут привести к тому, что бэкэнд будет предоставлять другую версию трека (особенно между разными пользователями), которые выходят за рамки Stack Overflow. Кроме того, обратные вызовы доставки музыки вызываются в другом потоке ко всему остальному, поэтому убедитесь, что вы не сталкиваетесь с ошибками при загрузке при сбросе счетчика/etc. – iKenndac

+0

Нет, я думаю, что никаких реальных проблем нет. Я думал, что могу уведомить свой уровень воспроизведения, когда был вызван «end_of_track», чтобы обновить состояние воспроизведения/паузы. Кроме того, я думал, что могу предположить, что доставляется только полная песня и не больше аудиоданных, даже если это тишина. – dnlkng

Смежные вопросы