Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Мультимедия, OpenGL/DirectX > Чтение mp3


Автор: АлексейМ 7.10.2005, 07:19
Приветствую! smile

Я пишу программку, которая должна через определённый интервал времени воспроизводить заданное количество раз файл mp3.

Программа должна автоматически определять длительность трека (для того, чтобы высчитывать интервал между проигрываниями трека). Ведь инфа о длительности трека содержится в самом mp3-файле. Только вот как прочитать эту инфу о треке? Посоветуйте, пожалуйста.

И ещё вопросик - какими функциями посоветуете пользоваться для того, чтобы проигрывлся сам трек?


Автор: chaos 7.10.2005, 07:57
в помощь тебе макросы MCIWnd смотри в мсдн, там ВСЕ есть!!!

Автор: АлексейМ 7.10.2005, 09:41
Спасибо!

Только вот у меня с msdn проблемка - мой vcpp сильно ругается, типа "Переустанови MSDN!". А где его достать? Подскажите smile

Автор: chaos 7.10.2005, 11:34
Цитата
А где его достать? Подскажите smile

купить))
или пользуй онлайн мсдн, вот ссылка для решения твоей проблемы
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/multimed/htm/_win32_mciwnd_reference.asp

Автор: АлексейМ 7.10.2005, 12:14
Благодарю smile

Автор: chaos 7.10.2005, 12:19
вот тебе еще не большой smile пример(тоже сталкивался с такой проблемой и написал свой класс)
h
Код

#include <vfw.h>

#pragma comment(lib, "vfw32.lib")

#define MS_MINUTE(ms)    (int(msf / 1000 / 60))
#define MS_SECOND(ms)    (int(msf / 1000))

class CSoundPlay
{
    CString m_soFileName;
    HWND m_hParent, m_hPlayer;
    bool m_fPlay;
public:
    CSoundPlay(HWND hParent = NULL)
        :m_hParent(hParent), m_hPlayer(NULL), 
        m_fPlay(false)
    {}

    ~CSoundPlay()
    { 
        MCIWndDestroy(m_hPlayer);
    }
    bool Init(HWND hParent);

    long Open(const char* c_sFileName);
    long Close();
    long Play();
    long PlayFromTo (long lPosFrom, long lPosTo = MCIWND_END); //milisecond
    long Pause();
    long Resume();
    long Stop();
    
    unsigned GetVolume(); 
    long SetVolume(unsigned uVolume);
    
    long GetPosition(); //milisecond
    long SetPosition(long lPos); //milisecond

    long GetLenght(); //milisecond

    enum _EVolume 
    {Min = 0, Avg = 50, Max = 100};
    typedef _EVolume Volume;
};


cpp

Код

#include "PlaySound.h"

bool CSoundPlay::Init(HWND hParent)
{
    m_hParent = hParent;
    ASSERT(m_hParent);

    m_hPlayer = MCIWndCreate(m_hParent,
                            AfxGetInstanceHandle(),
                            WS_CHILD | MCIWNDF_NOMENU| MCIWNDF_NOTIFYALL | MCIWNDF_NOPLAYBAR,
                            NULL);
    return m_hPlayer ? true : false; 
}

long CSoundPlay::Open(const char* c_sFileName)
{
    ASSERT(m_hPlayer);
    long lResult = 0;
    if (m_fPlay) 
        lResult = Close();

    if (c_sFileName && 0 == lResult)
    {
        m_soFileName = c_sFileName;
        lResult = MCIWndOpen(m_hPlayer, (char*)c_sFileName, NULL);
    }

    return lResult;
}

long CSoundPlay::Close()
{
    ASSERT(m_hPlayer);
    long lResult = MCIWndClose(m_hPlayer);
    if (0 == lResult)
    {
        m_fPlay = false;
        m_soFileName = "";
    }
    return lResult;
}

long CSoundPlay::Play()
{
    ASSERT(m_hPlayer);
    long lResult = 0;
    if (m_fPlay) 
        lResult = Stop();

    if (0 == lResult)
    {
        lResult = SetVolume(Volume::Avg);
        if (0 == lResult)
        {
            lResult = SetPosition(MCIWND_START);
            if (0 == lResult)
            {
                lResult = MCIWndPlay(m_hPlayer);
                m_fPlay = true;
            }
        }
    }

    return lResult;
}

long CSoundPlay::PlayFromTo (long lPosFrom, long lPosTo/* = MCIWND_END*/)
{
    ASSERT(m_hPlayer);
    return MCIWndPlayFromTo(m_hPlayer, lPosFrom, lPosTo);
}

long CSoundPlay::Pause()
{
    ASSERT(m_hPlayer);
    return MCIWndPause(m_hPlayer);
}

long CSoundPlay::Resume()
{
    ASSERT(m_hPlayer);
    return MCIWndResume(m_hPlayer);
}

long CSoundPlay::Stop()
{
    ASSERT (m_hPlayer);
    long lResult = MCIWndStop(m_hPlayer);
    if (0 == lResult)
        m_fPlay = false;
    return lResult;
}

unsigned CSoundPlay::GetVolume()
{
    ASSERT(m_hPlayer);
    return unsigned(MCIWndGetVolume(m_hPlayer) * 0.1);
}

long CSoundPlay::SetVolume(unsigned uVolume)
{
    ASSERT(m_hPlayer);
    if (uVolume > 100)
        uVolume = Volume::Max;

    return MCIWndSetVolume(m_hPlayer, uVolume * 10);
}

long CSoundPlay::GetPosition()
{
    ASSERT(m_hPlayer);
    return MCIWndGetPosition(m_hPlayer);
}

long CSoundPlay::SetPosition(long lPos)
{
    ASSERT(m_hPlayer);

    long lResult = MCIWndStop(m_hPlayer);
    if (0 == lResult)
        lResult = MCIWndPlayFrom(m_hPlayer, lPos);

    return lResult;
}

long CSoundPlay::GetLenght()
{
    ASSERT(m_hPlayer);
    return MCIWndGetLength(m_hPlayer);
}

Автор: АлексейМ 7.10.2005, 15:51
Просмотрел я это дело (по ссылке). Но по причине моего невысокого уровня владения английским и небольшого опыта программирования, у меня всё же остались вопросы.

Присмотрел я макрос MCIWndPlay для проигрывания трека. Пытаюсь разобраться. Выбор-то правильный?

Вопрос ко всем, кто имеет опыт работы с подобными вещами: например, нужно прочитать (воспризвести) лежащий на жёстком диске файл mp3. Какими функциями, макросами и в каком порядке посоветуете пользоваться?

И ещё - может, есть где в сети русская версия библиотеки мсдн?

P.S. Извиняюсь за такое большое количество вопросов.
Добавлено @ 15:53
Упс...

Написал своё сообщение в оффлайне, не знал, что уже кое-что есть smile smile smile

Спасибо!!!

Автор: chaos 7.10.2005, 18:13
если будешь пользоваться классом (см. выше)
то тебе для того чтобы проиграть файл на диске надо всего сделать
Пример: MFC-приложение на базе CDialog
Код

CSoundPlay m_oMp3Play;
....

BOOL CMp3Dlg::OnInitDialog()
{
    CDialog::OnInitDialog();
    SetIcon(m_hIcon, TRUE);        
    SetIcon(m_hIcon, FALSE);        
    
    m_oMp3Play.Init(m_hWnd);
    
    return TRUE; 
}

.....

m_oMp3Play.Open("D:\\Music\\01.mp3");
m_oMp3Play.Play();
......

m_oMp3Play.Close();

..........

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)