Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Win32 API - [решено] звук из AVI

Ответить
Настройки темы
Win32 API - [решено] звук из AVI
pva pva вне форума

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


Как достать (проиграть) звуковую дорожку из AVI?
делаю так:
Код: Выделить весь код
class AviStream
{
public:
    ~AviStream();
    AviStream(PAVIFILE avi_file, unsigned long fcc);
    void process();

protected:
    char* bufferInfo() {return &_buffer_info[0];}
    virtual void render(unsigned frame_index, std::vector<char>& data) = 0;

private:
    PAVISTREAM          _pstream;
    std::vector<char>   _buffer_info;
    std::vector<char>   _buffer;
    unsigned            _frame_no;
};

void AviStream::process()
{
    long size1 = 0; //байт на буфер
    long size2 = 0; //сэмплов на буфер

    AVIStreamRead(_pstream, _frame_no, AVISTREAMREAD_CONVENIENT, 0, 0, &size1, &size2);
    _buffer.resize(size1);

    AVIStreamRead(_pstream, _frame_no, size2, &_buffer[0], _buffer.size(), &size1, &size2);
    render(_frame_no, _buffer);

    ++_frame_no;
}
дорожку видео читает, звук - нет, возвращает байт на буфер 0, сэмплов на буфер 0.

Отправлено: 12:51, 12-11-2008

 
pva pva вне форума Автор темы

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


Странно... на некоторых роликах звук работает. А на некоторых слетает видео-поток в кодеке. Почему?

Отправлено: 15:39, 12-11-2008 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для Delirium

Ветеран


Сообщения: 5624
Благодарности: 936

Профиль | Отправить PM | Цитировать


Цитата pva:
на некоторых роликах звук работает. А на некоторых слетает видео-поток в кодеке »
А какие кодеки используют рабочий и нерабочий ролики? Может дело в этом?

-------

Пройденные курсы:
[Microsoft №10174 Sharepoint], [SharePoint]
Мои проекты:[CheckAdmins], [NetSend7], [System Uptime], [Remote RAdmin LogViewer],[Netdom GDI], [Holidays - напоминалка о днях рождения]

А я офис-гуру :)


Отправлено: 01:06, 13-11-2008 | #3

pva pva вне форума Автор темы

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


я думал, что он сам поднимает нужный кодек. Оказывается ошибался. Для видео поднимает, для аудио - не очень. Нашёл пример кода, где поднимается всё как надо. Всем пасиба

Отправлено: 23:33, 13-11-2008 | #4


Аватара для Delirium

Ветеран


Сообщения: 5624
Благодарности: 936

Профиль | Отправить PM | Цитировать


pva, ну а отметить тему решенной? Да и примерчик кода бы тоже не помешал, для законченности темы.

-------

Пройденные курсы:
[Microsoft №10174 Sharepoint], [SharePoint]
Мои проекты:[CheckAdmins], [NetSend7], [System Uptime], [Remote RAdmin LogViewer],[Netdom GDI], [Holidays - напоминалка о днях рождения]

А я офис-гуру :)


Отправлено: 01:01, 14-11-2008 | #5

pva pva вне форума Автор темы

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


ссылку не помню, да простят меня авторы текста
Код: Выделить весь код
static int nWaveOutHeadersCount = 0;

void CALLBACK waveOutProc(HWAVEOUT hwo, UINT uMsg, DWORD dwInstance, DWORD dwParam1, DWORD dwParam2)
{
  if (uMsg != WOM_DONE)
    return;
  LPWAVEHDR pwh = (LPWAVEHDR)dwParam1;
  char* pData = pwh->lpData;
  waveOutUnprepareHeader(hwo, pwh, sizeof(WAVEHDR));
  nWaveOutHeadersCount--;
  free(pwh);
  free(pData);
}

void PlayAviAudio(LPCSTR pszFile)
{
  AVIFileInit();
  PAVIFILE paf;
  AVIFileOpen(&paf, pszFile, OF_READ, 0);
  AVIFILEINFO afi;
  AVIFileInfo(paf, &afi, sizeof(AVIFILEINFO));
  PAVISTREAM pasAudio;
  AVIFileGetStream(paf, &pasAudio, streamtypeAUDIO, 0);
  AVISTREAMINFO asiAudio;
  AVIStreamInfo(pasAudio, &asiAudio, sizeof(AVISTREAMINFO));
  long nFormatSize;
  AVIStreamReadFormat(pasAudio, asiAudio.dwStart, NULL, &nFormatSize);
  WAVEFORMATEX* pwfxIn = (WAVEFORMATEX*)malloc(nFormatSize);
  AVIStreamReadFormat(pasAudio, asiAudio.dwStart, pwfxIn, &nFormatSize);
  WAVEFORMATEX wfxDec;
  memcpy(&wfxDec, pwfxIn, min(nFormatSize, sizeof(WAVEFORMATEX)));
  wfxDec.wFormatTag = WAVE_FORMAT_PCM;
  wfxDec.wBitsPerSample = 16;
  wfxDec.nBlockAlign = wfxDec.nChannels * wfxDec.wBitsPerSample / 8;
  wfxDec.nAvgBytesPerSec = wfxDec.nSamplesPerSec * wfxDec.nBlockAlign;
  HACMSTREAM has;
  acmStreamOpen(&has, NULL, pwfxIn, &wfxDec, NULL, NULL, 0, ACM_STREAMOPENF_NONREALTIME);
  HWAVEOUT hwo;
  waveOutOpen(&hwo, WAVE_MAPPER, &wfxDec, (DWORD_PTR)waveOutProc, 0, CALLBACK_FUNCTION);
  BYTE *pInData = NULL, *pDecData;
  long nInBufSize = 0, nSampleSize = 0, nBytesCount = 0, nSamplesCount = 1;
  DWORD nDecBufSize;
  for (int nSample = asiAudio.dwStart; nSample <= asiAudio.dwStart + asiAudio.dwLength; nSample += nSamplesCount)
  {
    if (asiAudio.dwSampleSize == 0)
    {
      AVIStreamSampleSize(pasAudio, nSample, &nSampleSize);
      nBytesCount = nSampleSize;
      if (nBytesCount > nInBufSize)
      {
        pInData = (BYTE*)realloc(pInData, nBytesCount);
        nInBufSize = nBytesCount;
      }
      AVIStreamRead(pasAudio, nSample, 1, pInData, nInBufSize, NULL, NULL);
    }
    else
    {
      nSamplesCount = 1152;
      nBytesCount = nSamplesCount * asiAudio.dwSampleSize;
      if (nBytesCount > nInBufSize)
      {
        pInData = (BYTE*)realloc(pInData, nBytesCount);
        nInBufSize = nBytesCount;
      }
      AVIStreamRead(pasAudio, nSample, nSamplesCount, pInData, nInBufSize, &nBytesCount, &nSamplesCount);
    }
    acmStreamSize(has, nBytesCount, &nDecBufSize, ACM_STREAMSIZEF_SOURCE);
    pDecData = (BYTE*)malloc(nDecBufSize);
    ACMSTREAMHEADER ash;
    memset(&ash, 0, sizeof(ACMSTREAMHEADER));
    ash.cbStruct = sizeof(ACMSTREAMHEADER);
    ash.pbSrc = pInData;
    ash.cbSrcLength = nBytesCount;
    ash.pbDst = pDecData;
    ash.cbDstLength = nDecBufSize;
    acmStreamPrepareHeader(has, &ash, 0);
    acmStreamConvert(has, &ash, 0);
    WAVEHDR* pwh = (WAVEHDR*)malloc(sizeof(WAVEHDR));
    memset(pwh, 0, sizeof(WAVEHDR));
    pwh->lpData = (LPSTR)ash.pbDst;
    pwh->dwBufferLength = ash.cbDstLengthUsed;
    waveOutPrepareHeader(hwo, pwh, sizeof(WAVEHDR));
    waveOutWrite(hwo, pwh, sizeof(WAVEHDR));
    nWaveOutHeadersCount++;
    acmStreamUnprepareHeader(has, &ash, 0);
    while (nWaveOutHeadersCount > 1)
    {
      MSG msg;
      if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
      {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
      }
      Sleep(10);
    }
  }
  waveOutReset(hwo);
  waveOutClose(hwo);
  acmStreamClose(has, 0);
  AVIStreamRelease(pasAudio);
  AVIFileRelease(paf);
  AVIFileExit();
}











#include <vfw.h>

#ifndef DIBSIZE
#define WIDTHBYTES(bits) ((DWORD)(((bits)+31) & (~31)) / 8)
#define DIBWIDTHBYTES(bi) (DWORD)WIDTHBYTES((DWORD)(bi).biWidth * (DWORD)(bi).biBitCount)
#define _DIBSIZE(bi) (DIBWIDTHBYTES(bi) * (DWORD)(bi).biHeight)
#define DIBSIZE(bi) ((bi).biHeight < 0 ? (-1)*(_DIBSIZE(bi)) : _DIBSIZE(bi))
#endif

void PlayAvi(LPCSTR pszFile, HWND hWndOutput)
{
  AVIFileInit();
  PAVIFILE paf;
  AVIFileOpen(&paf, pszFile, OF_READ, 0);
  AVIFILEINFO afi;
  AVIFileInfo(paf, &afi, sizeof(AVIFILEINFO));
  PAVISTREAM pas;
  AVIFileGetStream(paf, &pas, streamtypeVIDEO, 0);
  AVISTREAMINFO asi;
  AVIStreamInfo(pas, &asi, sizeof(AVISTREAMINFO));
  long nFormatSize;
  AVIStreamReadFormat(pas, asi.dwStart, NULL, &nFormatSize);
  BITMAPINFOHEADER* pbihIn = (BITMAPINFOHEADER*)malloc(nFormatSize);
  AVIStreamReadFormat(pas, asi.dwStart, pbihIn, &nFormatSize);
  BITMAPINFOHEADER bihDec;
  memcpy(&bihDec, pbihIn, sizeof(BITMAPINFOHEADER));
  bihDec.biCompression = BI_RGB;
  bihDec.biBitCount = 24;
  bihDec.biSizeImage = DIBSIZE(bihDec);
  BYTE* pDecData = (BYTE*)malloc(bihDec.biSizeImage);
  memset(pDecData, 0, bihDec.biSizeImage);
  HIC hic = ICDecompressOpen(ICTYPE_VIDEO, pbihIn->biCompression, pbihIn, &bihDec);
  ICDecompressBegin(hic, pbihIn, &bihDec);
  HDC hdc = GetDC(hWndOutput);
  RECT rc;
  GetClientRect(hWndOutput, &rc);
  HDRAWDIB hdd = DrawDibOpen();
  BYTE* pInData = NULL;
  long nBufSize = 0, nSampleSize = 0;
  for (int nSample = asi.dwStart; nSample <= asi.dwStart + asi.dwLength; nSample++)
  {
    AVIStreamSampleSize(pas, nSample, &nSampleSize);
    if (nSampleSize > nBufSize)
    {
      pInData = (BYTE*)realloc(pInData, nSampleSize);
      nBufSize = nSampleSize;
    }
    AVIStreamRead(pas, nSample, 1, pInData, nBufSize, NULL, NULL);
    ICDecompress(hic, 0, pbihIn, pInData, &bihDec, pDecData);
    // сейчас в pDecData текущий кадр в виде битмапки, рисуем его
    DrawDibDraw(hdd, hdc, 0, 0, rc.right - rc.left, rc.bottom - rc.top, &bihDec, pDecData, 0, 0, bihDec.biWidth, bihDec.biHeight, 0);
  }
  DrawDibClose(hdd);
  ReleaseDC(hWndOutput, hdc);
  ICDecompressEnd(hic);
  ICClose(hic);
  AVIStreamRelease(pas);
  AVIFileRelease(paf);
  AVIFileExit();
  free(pInData);
  free(pDecData);
  free(pbihIn);
}
Это сообщение посчитали полезным следующие участники:

Отправлено: 16:14, 17-11-2008 | #6



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Win32 API - [решено] звук из AVI

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
avi и звук migi Видео и аудио: обработка и кодирование 1 09-03-2009 04:24
AVI на DVD-плеере — искажённый и тихий звук SkeletOn1991 Видео и аудио: обработка и кодирование 11 11-02-2008 13:01
Звук в avi фильмах binders Видео и аудио: обработка и кодирование 6 16-01-2007 01:49
Звук из avi (mpg) и обратно? Slavka Видео и аудио: обработка и кодирование 7 08-12-2005 19:32
AVI(DivX3,WMA)->AVI(Divx5,MPEG-3) XPurple Видео и аудио: обработка и кодирование 4 31-03-2005 09:24




 
Переход