青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

JACKY_ZZ[貓貓愛吃魚]

春風(fēng)拂面兩頰紅,秋葉灑地一片金。 夏荷搖曳一身輕,冬雪覆蓋大地銀。
posts - 30, comments - 123, trackbacks - 0, articles - 0

[C/C++] ffmpeg小試

Posted on 2009-11-24 17:44 jacky_zz 閱讀(4979) 評論(13)  編輯 收藏 引用 所屬分類: C/C++
此代碼在vs2008下編譯,基于最新的ffmpeg版本(svn下載),搭建MSYS+MinGW編譯環(huán)境編譯,如何搭建,在google上能搜索到。 源碼可在此下載。
但除了aac和ogg格式播放出錯,其余格式正常,不知為何,有ffmpeg開發(fā)經(jīng)驗的朋友請給予幫助,謝謝。代碼貼于下方。
  1#include <stdio.h>
  2#include <stdlib.h>
  3#include <windows.h>
  4#include <mmsystem.h>
  5
  6#pragma comment(lib, "winmm.lib")
  7
  8#ifdef __cplusplus
  9extern "C" {
 10#endif
 11
 12#include "./include/avcodec.h"
 13#include "./include/avformat.h"
 14#include "./include/avutil.h"
 15#include "./include/mem.h"
 16
 17#ifdef __cplusplus
 18}

 19#endif
 20
 21#define BLOCK_SIZE  4608
 22#define BLOCK_COUNT 20
 23
 24HWAVEOUT hWaveOut = NULL;
 25
 26static void CALLBACK waveOutProc(HWAVEOUT, UINT, DWORD, DWORD, DWORD);
 27static WAVEHDR* allocateBlocks(int size, int count);
 28static void freeBlocks(WAVEHDR* blockArray);
 29static void writeAudio(HWAVEOUT hWaveOut, LPSTR data, int size);
 30
 31static CRITICAL_SECTION waveCriticalSection;
 32static WAVEHDR*         waveBlocks;
 33static volatile unsigned int     waveFreeBlockCount;
 34static int              waveCurrentBlock;
 35
 36typedef struct AudioState {
 37    AVFormatContext* pFmtCtx;
 38    AVCodecContext* pCodecCtx;
 39    AVCodec* pCodec;
 40    uint8_t audio_buf1[(AVCODEC_MAX_AUDIO_FRAME_SIZE * 3/ 2];
 41    uint8_t* audio_buf;
 42    unsigned int audio_buf_size;
 43    int audio_buf_index;
 44    AVPacket audio_pkt_temp;
 45    AVPacket audio_pkt;
 46    uint8_t* audio_pkt_data;
 47    int audio_pkt_size;
 48    int stream_index;
 49}
 AudioState;
 50
 51int audio_decode_frame(AudioState* pState) {
 52
 53    AVPacket* pkt_temp = &pState->audio_pkt_temp;
 54    AVPacket* pkt = &pState->audio_pkt;
 55    AVCodecContext* dec= pState->pCodecCtx;
 56    int len = 0, data_size = sizeof(pState->audio_buf1);
 57    int err = 0;
 58
 59    for( ; ; ) {
 60        while (pkt_temp->size > 0{
 61            data_size = sizeof(pState->audio_buf1);
 62            len = avcodec_decode_audio3(dec, (int16_t*)pState->audio_buf1, &data_size, pkt_temp);
 63            if (len < 0{
 64                pkt_temp->size = 0;
 65                break;
 66            }

 67
 68            pkt_temp->data += len;
 69            pkt_temp->size -= len;
 70
 71            if (data_size <= 0)
 72                continue;
 73
 74            pState->audio_buf = pState->audio_buf1;
 75            return data_size;
 76        }

 77
 78        if (pkt->data)
 79            av_free_packet(pkt);
 80
 81        if((err = av_read_frame(pState->pFmtCtx, pkt)) < 0)
 82            return -1;
 83
 84        pkt_temp->data = pkt->data;
 85        pkt_temp->size = pkt->size;
 86    }

 87
 88    return -1;
 89}

 90
 91int main(int argc, char* argv[]) {
 92    int err = 0;
 93    AudioState audio_state = {0};
 94    unsigned int i = 0;
 95    unsigned int ready = 0;
 96
 97    OPENFILENAME ofn = {0};
 98    char filename[MAX_PATH];
 99    WAVEFORMATEX wfx = {0};
100    uint8_t buffer[BLOCK_SIZE];
101    uint8_t* pbuffer = buffer;
102    AVInputFormat* iformat = NULL;
103    
104    int audio_size = 0, data_size = 0;
105    int len = 0, len1 = 0, eof = 0, size = 0;
106
107    memset(&ofn, 0sizeof(OPENFILENAME));
108    ofn.lStructSize = sizeof(ofn);
109    ofn.hwndOwner = GetDesktopWindow();
110    ofn.lpstrFile = filename;
111    ofn.lpstrFile[0= '\0';
112    ofn.nMaxFile = sizeof(filename) / sizeof(filename[0]);
113    ofn.lpstrFilter = _TEXT("All support files\0*.aac;*.ape;*.flac;*.mp3;*.mp4;*.mpc;*.ogg;*.tta;*.wma;*.wav\0");
114    ofn.nFilterIndex = 1;
115    ofn.lpstrFileTitle = NULL;
116    ofn.nMaxFileTitle = 0;
117    ofn.lpstrInitialDir = NULL;
118    ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
119
120    if (GetOpenFileName(&ofn) == FALSE)
121        return 0;
122
123    av_register_all();
124
125    err = av_open_input_file(&audio_state.pFmtCtx, filename, NULL, 0, NULL);
126    if(err < 0{
127        printf("can not open file %s.\n", filename);
128        return -1;
129    }

130
131    err = av_find_stream_info(audio_state.pFmtCtx);
132    if(err < 0{
133        printf("can not find stream info of file %s.\n", filename);
134        return -1;
135    }

136
137    for(i = 0; i < audio_state.pFmtCtx->nb_streams; i++{
138        if(audio_state.pFmtCtx->streams[i]->codec->codec_type == CODEC_TYPE_AUDIO) {
139            audio_state.pCodecCtx = audio_state.pFmtCtx->streams[i]->codec;
140            audio_state.stream_index = i;
141            ready = 1;
142            break;
143        }

144    }

145
146    if(!ready)
147        return -1;
148
149    audio_state.pCodec = avcodec_find_decoder(audio_state.pCodecCtx->codec_id);
150    if(!audio_state.pCodec || avcodec_open(audio_state.pCodecCtx, audio_state.pCodec) < 0)
151        return -1;
152
153    wfx.nSamplesPerSec  = audio_state.pCodecCtx->sample_rate;
154    switch(audio_state.pCodecCtx->sample_fmt)
155    {
156    case SAMPLE_FMT_U8:
157        wfx.wBitsPerSample = 8;
158        break;
159    case SAMPLE_FMT_S16:
160        wfx.wBitsPerSample = 16;
161        break;
162    case SAMPLE_FMT_S32:
163        wfx.wBitsPerSample = 32;
164        break;
165    case SAMPLE_FMT_FLT:
166        wfx.wBitsPerSample = sizeof(double* 8;
167        break;
168    default:
169        wfx.wBitsPerSample = 0;
170        break;
171    }

172
173    wfx.nChannels       = FFMIN(2, audio_state.pCodecCtx->channels);
174    wfx.cbSize          = 0;
175    wfx.wFormatTag      = WAVE_FORMAT_PCM;
176    wfx.nBlockAlign     = (wfx.wBitsPerSample * wfx.nChannels) >> 3;
177    wfx.nAvgBytesPerSec = wfx.nBlockAlign * wfx.nSamplesPerSec;
178
179    waveBlocks         = allocateBlocks(BLOCK_SIZE, BLOCK_COUNT);
180    waveFreeBlockCount = BLOCK_COUNT;
181    waveCurrentBlock   = 0;
182
183    InitializeCriticalSection(&waveCriticalSection);
184
185    // open wave out device
186    if(waveOutOpen(&hWaveOut, WAVE_MAPPER,  &wfx, (DWORD_PTR)waveOutProc, 
187        (DWORD_PTR)&waveFreeBlockCount, CALLBACK_FUNCTION) != MMSYSERR_NOERROR) {
188        fprintf(stderr, "%s: unable to open wave mapper device\n", argv[0]);
189        ExitProcess(1);
190    }

191
192    // play loop
193    for( ; ; ) {
194
195        len = BLOCK_SIZE;
196        size = 0;
197        pbuffer = buffer;
198
199        if(eof)
200            break;
201
202        while(len > 0{
203            if(audio_state.audio_buf_index >= (int)audio_state.audio_buf_size) {
204                audio_size = audio_decode_frame(&audio_state);
205                if(audio_size < 0{
206                    if(size > 0)
207                        break;
208
209                    eof = 1;
210                    break;
211                }

212
213                audio_state.audio_buf_size = audio_size;
214                audio_state.audio_buf_index = 0;
215            }

216
217            len1 = audio_state.audio_buf_size - audio_state.audio_buf_index;
218            if(len1 > len)
219                len1 = len;
220
221            memcpy(pbuffer, (uint8_t *)audio_state.audio_buf + audio_state.audio_buf_index, len1);
222
223            len -= len1;
224            pbuffer += len1;
225            size += len1;
226            audio_state.audio_buf_index += len1;
227        }

228
229        writeAudio(hWaveOut, (char*)buffer, size);
230    }

231
232    // wait for complete
233    for( ; ; ) {
234        if(waveFreeBlockCount >= BLOCK_COUNT)
235            break;
236
237        Sleep(10);
238    }

239
240    for(i = 0; i < waveFreeBlockCount; i++)
241        if(waveBlocks[i].dwFlags & WHDR_PREPARED)
242            waveOutUnprepareHeader(hWaveOut, &waveBlocks[i], sizeof(WAVEHDR));
243
244    DeleteCriticalSection(&waveCriticalSection);
245    freeBlocks(waveBlocks);
246    waveOutClose(hWaveOut);
247
248    avcodec_close(audio_state.pCodecCtx);
249
250    system("pause");
251    return 0;
252}

253
254static void writeAudio(HWAVEOUT hWaveOut, LPSTR data, int size)
255{
256    WAVEHDR* current;
257    int remain;
258
259    current = &waveBlocks[waveCurrentBlock];
260
261    while(size > 0{
262        /* 
263        * first make sure the header we're going to use is unprepared
264        */

265        if(current->dwFlags & WHDR_PREPARED)
266            waveOutUnprepareHeader(hWaveOut, current, sizeof(WAVEHDR));
267
268        if(size < (int)(BLOCK_SIZE - current->dwUser)) {
269            memcpy(current->lpData + current->dwUser, data, size);
270            current->dwUser += size;
271            break;
272        }

273
274        remain = BLOCK_SIZE - current->dwUser;
275        memcpy(current->lpData + current->dwUser, data, remain);
276        size -= remain;
277        data += remain;
278        current->dwBufferLength = BLOCK_SIZE;
279
280        waveOutPrepareHeader(hWaveOut, current, sizeof(WAVEHDR));
281        waveOutWrite(hWaveOut, current, sizeof(WAVEHDR));
282
283        EnterCriticalSection(&waveCriticalSection);
284        waveFreeBlockCount--;
285        LeaveCriticalSection(&waveCriticalSection);
286
287        /*
288        * wait for a block to become free
289        */

290        while(!waveFreeBlockCount)
291            Sleep(10);
292
293        /*
294        * point to the next block
295        */

296        waveCurrentBlock++;
297        waveCurrentBlock %= BLOCK_COUNT;
298
299        current = &waveBlocks[waveCurrentBlock];
300        current->dwUser = 0;
301    }

302}

303
304static WAVEHDR* allocateBlocks(int size, int count)
305{
306    char* buffer;
307    int i;
308    WAVEHDR* blocks;
309    DWORD totalBufferSize = (size + sizeof(WAVEHDR)) * count;
310
311    /*
312    * allocate memory for the entire set in one go
313    */

314    if((buffer = (char*)HeapAlloc(
315        GetProcessHeap(), 
316        HEAP_ZERO_MEMORY, 
317        totalBufferSize
318        )) == NULL) {
319            fprintf(stderr, "Memory allocation error\n");
320            ExitProcess(1);
321    }

322
323    /*
324    * and set up the pointers to each bit
325    */

326    blocks = (WAVEHDR*)buffer;
327    buffer += sizeof(WAVEHDR) * count;
328    for(i = 0; i < count; i++{
329        blocks[i].dwBufferLength = size;
330        blocks[i].lpData = buffer;
331        buffer += size;
332    }

333
334    return blocks;
335}

336
337static void freeBlocks(WAVEHDR* blockArray)
338{
339    /* 
340    * and this is why allocateBlocks works the way it does
341    */
 
342    HeapFree(GetProcessHeap(), 0, blockArray);
343}

344
345static void CALLBACK waveOutProc(
346                                 HWAVEOUT hWaveOut, 
347                                 UINT uMsg, 
348                                 DWORD dwInstance,  
349                                 DWORD dwParam1,    
350                                 DWORD dwParam2     
351                                 )
352{
353    int* freeBlockCounter = (int*)dwInstance;
354    /*
355    * ignore calls that occur due to opening and closing the
356    * device.
357    */

358    if(uMsg != WOM_DONE)
359        return;
360
361    EnterCriticalSection(&waveCriticalSection);
362    (*freeBlockCounter)++;
363    LeaveCriticalSection(&waveCriticalSection);
364}

Feedback

# re: ffmpeg小試  回復(fù)  更多評論   

2009-11-24 17:47 by cexer
最近開始研究 ffmpeg,關(guān)注一下博主。

# re: ffmpeg小試[未登錄]  回復(fù)  更多評論   

2009-11-24 20:05 by Bill Hsu
FFmpeg有個恥辱名單,LZ聽所過嗎(⊙_⊙)?

# re: ffmpeg小試  回復(fù)  更多評論   

2009-11-24 21:02 by jacky_zz
和我的程序有關(guān)系嗎?況且我的這個程序附帶了源碼,雖然簡單。

# re: ffmpeg小試  回復(fù)  更多評論   

2009-11-24 21:19 by 毛毛
不錯,收藏,學(xué)習(xí)

# re: ffmpeg小試  回復(fù)  更多評論   

2009-11-25 11:03 by jacky_zz
找到不能播放aac和ogg的問題了,原因是在ffmpeg里分配內(nèi)存需要用av_malloc,釋放內(nèi)存要用av_free,因為windows和linux下內(nèi)存分配存在不同,而ffmpeg在解碼的時候是要檢查內(nèi)存是否對齊(內(nèi)存對齊可以加快CPU的處理速度),所以在程序里在window環(huán)境下通過malloc或者通過數(shù)組的方式分配的內(nèi)存不完全是內(nèi)存對齊的,所以在遇到aac和ogg這種幀長度與其它音頻格式幀長度不一致時,就有可能在運行時出錯。修改后的代碼如下,讀者參照著自己修改即可。

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <mmsystem.h>

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

#ifdef __cplusplus
extern "C" {
#endif

#include "./include/avcodec.h"
#include "./include/avformat.h"
#include "./include/avutil.h"
#include "./include/mem.h"

#ifdef __cplusplus
}
#endif

#define BLOCK_SIZE 4608
#define BLOCK_COUNT 20

HWAVEOUT hWaveOut = NULL;

static void CALLBACK waveOutProc(HWAVEOUT, UINT, DWORD, DWORD, DWORD);
static WAVEHDR* allocateBlocks(int size, int count);
static void freeBlocks(WAVEHDR* blockArray);
static void writeAudio(HWAVEOUT hWaveOut, LPSTR data, int size);

static CRITICAL_SECTION waveCriticalSection;
static WAVEHDR* waveBlocks;
static volatile unsigned int waveFreeBlockCount;
static int waveCurrentBlock;

typedef struct AudioState {
AVFormatContext* pFmtCtx;
AVCodecContext* pCodecCtx;
AVCodec* pCodec;
//uint8_t* audio_buf1[(AVCODEC_MAX_AUDIO_FRAME_SIZE * 3) / 2];
uint8_t* audio_buf1;
uint8_t* audio_buf;
unsigned int audio_buf_size; /* in bytes */
unsigned int buffer_size;
int audio_buf_index; /* in bytes */
AVPacket audio_pkt_temp;
AVPacket audio_pkt;
uint8_t* audio_pkt_data;
int audio_pkt_size;

int stream_index;
} AudioState;

int audio_decode_frame(AudioState* pState) {

AVPacket* pkt_temp = &pState->audio_pkt_temp;
AVPacket* pkt = &pState->audio_pkt;
AVCodecContext* dec= pState->pCodecCtx;
int len = 0, data_size = sizeof(pState->audio_buf1);
int err = 0;

for( ; ; ) {
while (pkt_temp->size > 0) {
// data_size = sizeof(pState->audio_buf1);
data_size = pState->buffer_size;
len = avcodec_decode_audio3(dec, (int16_t*)pState->audio_buf1, &data_size, pkt_temp);
if (len < 0) {
pkt_temp->size = 0;
break;
}

pkt_temp->data += len;
pkt_temp->size -= len;

if (data_size <= 0)
continue;

pState->audio_buf = pState->audio_buf1;
return data_size;
}

if (pkt->data)
av_free_packet(pkt);

if((err = av_read_frame(pState->pFmtCtx, pkt)) < 0)
return -1;

pkt_temp->data = pkt->data;
pkt_temp->size = pkt->size;
}

return -1;
}

int main(int argc, char* argv[]) {
int err = 0;
AudioState audio_state = {0};
unsigned int i = 0;
unsigned int ready = 0;

OPENFILENAME ofn = {0};
char filename[MAX_PATH];
WAVEFORMATEX wfx = {0};
uint8_t buffer[BLOCK_SIZE];
uint8_t* pbuffer = buffer;
AVInputFormat* iformat = NULL;

int audio_size = 0, data_size = 0;
int len = 0, len1 = 0, eof = 0, size = 0;

memset(&ofn, 0, sizeof(OPENFILENAME));
ofn.lStructSize = sizeof(ofn);
ofn.hwndOwner = GetDesktopWindow();
ofn.lpstrFile = filename;
ofn.lpstrFile[0] = '\0';
ofn.nMaxFile = sizeof(filename) / sizeof(filename[0]);
ofn.lpstrFilter = _TEXT("All support files\0*.aac;*.ape;*.flac;*.mp3;*.mp4;*.mpc;*.ogg;*.tta;*.wma;*.wav\0");
ofn.nFilterIndex = 1;
ofn.lpstrFileTitle = NULL;
ofn.nMaxFileTitle = 0;
ofn.lpstrInitialDir = NULL;
ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;

if (GetOpenFileName(&ofn) == FALSE)
return 0;

av_register_all();

err = av_open_input_file(&audio_state.pFmtCtx, filename, NULL, 0, NULL);
if(err < 0) {
printf("can not open file %s.\n", filename);
return -1;
}

err = av_find_stream_info(audio_state.pFmtCtx);
if(err < 0) {
printf("can not find stream info of file %s.\n", filename);
return -1;
}

for(i = 0; i < audio_state.pFmtCtx->nb_streams; i++) {
if(audio_state.pFmtCtx->streams[i]->codec->codec_type == CODEC_TYPE_AUDIO) {
audio_state.pCodecCtx = audio_state.pFmtCtx->streams[i]->codec;
audio_state.stream_index = i;
ready = 1;
break;
}
}

if(!ready)
return -1;

audio_state.pCodec = avcodec_find_decoder(audio_state.pCodecCtx->codec_id);
if(!audio_state.pCodec || avcodec_open(audio_state.pCodecCtx, audio_state.pCodec) < 0)
return -1;

wfx.nSamplesPerSec = audio_state.pCodecCtx->sample_rate;
switch(audio_state.pCodecCtx->sample_fmt)
{
case SAMPLE_FMT_U8:
wfx.wBitsPerSample = 8;
break;
case SAMPLE_FMT_S16:
wfx.wBitsPerSample = 16;
break;
case SAMPLE_FMT_S32:
wfx.wBitsPerSample = 32;
break;
case SAMPLE_FMT_FLT:
wfx.wBitsPerSample = sizeof(double) * 8;
break;
default:
wfx.wBitsPerSample = 0;
break;
}

wfx.nChannels = FFMIN(2, audio_state.pCodecCtx->channels);
wfx.cbSize = 0;
wfx.wFormatTag = WAVE_FORMAT_PCM;
wfx.nBlockAlign = (wfx.wBitsPerSample * wfx.nChannels) >> 3;
wfx.nAvgBytesPerSec = wfx.nBlockAlign * wfx.nSamplesPerSec;

waveBlocks = allocateBlocks(BLOCK_SIZE, BLOCK_COUNT);
waveFreeBlockCount = BLOCK_COUNT;
waveCurrentBlock = 0;

InitializeCriticalSection(&waveCriticalSection);

// open wave out device
if(waveOutOpen(&hWaveOut, WAVE_MAPPER, &wfx, (DWORD_PTR)waveOutProc,
(DWORD_PTR)&waveFreeBlockCount, CALLBACK_FUNCTION) != MMSYSERR_NOERROR) {
fprintf(stderr, "%s: unable to open wave mapper device\n", argv[0]);
ExitProcess(1);
}

// allocate memory
audio_state.audio_buf1 =(uint8_t*)av_malloc(buffer_size);
audio_state.buffer_size = buffer_size;

// play loop
for( ; ; ) {

len = BLOCK_SIZE;
size = 0;
pbuffer = buffer;

if(eof)
break;

while(len > 0) {
if(audio_state.audio_buf_index >= (int)audio_state.audio_buf_size) {
audio_size = audio_decode_frame(&audio_state);
if(audio_size < 0) {
if(size > 0)
break;

eof = 1;
break;
}

audio_state.audio_buf_size = audio_size;
audio_state.audio_buf_index = 0;
}

len1 = audio_state.audio_buf_size - audio_state.audio_buf_index;
if(len1 > len)
len1 = len;

memcpy(pbuffer, (uint8_t *)audio_state.audio_buf + audio_state.audio_buf_index, len1);

len -= len1;
pbuffer += len1;
size += len1;
audio_state.audio_buf_index += len1;
}

writeAudio(hWaveOut, (char*)buffer, size);
}

// free allocated memory
av_free(audio_state.audio_buf1);
audio_state.audio_buf1 = NULL;

// wait for complete
for( ; ; ) {
if(waveFreeBlockCount >= BLOCK_COUNT)
break;

Sleep(10);
}

for(i = 0; i < waveFreeBlockCount; i++)
if(waveBlocks[i].dwFlags & WHDR_PREPARED)
waveOutUnprepareHeader(hWaveOut, &waveBlocks[i], sizeof(WAVEHDR));

DeleteCriticalSection(&waveCriticalSection);
freeBlocks(waveBlocks);
waveOutClose(hWaveOut);

avcodec_close(audio_state.pCodecCtx);

system("pause");
return 0;
}

static void writeAudio(HWAVEOUT hWaveOut, LPSTR data, int size)
{
WAVEHDR* current;
int remain;

current = &waveBlocks[waveCurrentBlock];

while(size > 0) {
/*
* first make sure the header we're going to use is unprepared
*/
if(current->dwFlags & WHDR_PREPARED)
waveOutUnprepareHeader(hWaveOut, current, sizeof(WAVEHDR));

if(size < (int)(BLOCK_SIZE - current->dwUser)) {
memcpy(current->lpData + current->dwUser, data, size);
current->dwUser += size;
break;
}

remain = BLOCK_SIZE - current->dwUser;
memcpy(current->lpData + current->dwUser, data, remain);
size -= remain;
data += remain;
current->dwBufferLength = BLOCK_SIZE;

waveOutPrepareHeader(hWaveOut, current, sizeof(WAVEHDR));
waveOutWrite(hWaveOut, current, sizeof(WAVEHDR));

EnterCriticalSection(&waveCriticalSection);
waveFreeBlockCount--;
LeaveCriticalSection(&waveCriticalSection);

/*
* wait for a block to become free
*/
while(!waveFreeBlockCount)
Sleep(10);

/*
* point to the next block
*/
waveCurrentBlock++;
waveCurrentBlock %= BLOCK_COUNT;

current = &waveBlocks[waveCurrentBlock];
current->dwUser = 0;
}
}

static WAVEHDR* allocateBlocks(int size, int count)
{
char* buffer;
int i;
WAVEHDR* blocks;
DWORD totalBufferSize = (size + sizeof(WAVEHDR)) * count;

/*
* allocate memory for the entire set in one go
*/
if((buffer = (char*)HeapAlloc(
GetProcessHeap(),
HEAP_ZERO_MEMORY,
totalBufferSize
)) == NULL) {
fprintf(stderr, "Memory allocation error\n");
ExitProcess(1);
}

/*
* and set up the pointers to each bit
*/
blocks = (WAVEHDR*)buffer;
buffer += sizeof(WAVEHDR) * count;
for(i = 0; i < count; i++) {
blocks[i].dwBufferLength = size;
blocks[i].lpData = buffer;
buffer += size;
}

return blocks;
}

static void freeBlocks(WAVEHDR* blockArray)
{
/*
* and this is why allocateBlocks works the way it does
*/
HeapFree(GetProcessHeap(), 0, blockArray);
}

static void CALLBACK waveOutProc(
HWAVEOUT hWaveOut,
UINT uMsg,
DWORD dwInstance,
DWORD dwParam1,
DWORD dwParam2
)
{
int* freeBlockCounter = (int*)dwInstance;
/*
* ignore calls that occur due to opening and closing the
* device.
*/
if(uMsg != WOM_DONE)
return;

EnterCriticalSection(&waveCriticalSection);
(*freeBlockCounter)++;
LeaveCriticalSection(&waveCriticalSection);
}

# re: ffmpeg小試  回復(fù)  更多評論   

2009-12-21 18:44 by TS,MPEG2,dvbc專家
你的下載包里面,沒有.avcodec-52.dll 所以無法運行.

# re: ffmpeg小試  回復(fù)  更多評論   

2009-12-22 11:41 by seliu
當(dāng)初我也做了一個MSYS+MinGW,想研究一下ffmpeg.發(fā)現(xiàn)MSYS本質(zhì)不是應(yīng)用于linux的,如果做windows開發(fā),用ffmpeg sdk好像足夠了。
偶沒有時間做了,那位大蝦搭建了cygwin+MinGW,希望共同研究一下ffmpeg在linux下特別時嵌入式下的應(yīng)用。

# re: ffmpeg小試  回復(fù)  更多評論   

2011-06-17 00:13 by f4s
謝謝你的代碼。問題已經(jīng)解決了。

# re: ffmpeg小試  回復(fù)  更多評論   

2011-07-09 23:20 by ffish
感謝樓主的代碼。把av_read_frame那兩行改成下面這樣,就可以直接播絕大部分視頻文件了(聲音部分)。

pkt->stream_index = -1;
while(pkt->stream_index != pState->stream_index) {
if((err = av_read_frame(pState->pFmtCtx, pkt)) < 0)
return -1;
}

# re: ffmpeg小試  回復(fù)  更多評論   

2011-12-13 17:44 by glueless lace wigs
暴風(fēng)是不是你弄的

# re: ffmpeg小試[未登錄]  回復(fù)  更多評論   

2011-12-26 15:34 by jacky_zz
@glueless lace wigs
不是,要是有那本事,就不玩了。

# re: ffmpeg小試[未登錄]  回復(fù)  更多評論   

2012-01-25 01:57 by danny
謝謝jackzz,在我眼里你已經(jīng)很牛了,剛剛在WinCE上用你的修正后代碼測試了一下mp3、flac、ape、ogg、wma、wav,都播得很happy,不錯不錯。

# re: ffmpeg小試  回復(fù)  更多評論   

2013-01-05 21:45 by cheaterlin
我的QQ是475316440~麻煩加一下,關(guān)于解碼,我有一些疑問~thanks~
簡述就是avcodec_decode_audio3((AVCodecContext *avctx, int16_t *samples,int *frame_size_ptr,AVPacket *avpkt))解出一幀的數(shù)據(jù),這寫數(shù)據(jù),不總是在samples的最前面順序排列?
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产噜噜噜噜噜久久久久久久久 | 黄色成人精品网站| 欧美日韩一区二区精品| 米奇777超碰欧美日韩亚洲| 久久成人免费| 久久久国产视频91| 久久综合给合| 欧美日韩精品二区第二页| 欧美片第一页| 国产精品性做久久久久久| 国产日韩精品一区二区三区在线| 国产亚洲精品久久久久久| 国产一在线精品一区在线观看| 伊大人香蕉综合8在线视| 精品成人久久| 99热这里只有精品8| 亚洲在线不卡| 久久精品在线播放| 亚洲国产精品成人一区二区| 欧美吻胸吃奶大尺度电影| 欧美午夜久久| 亚洲第一偷拍| 午夜精品婷婷| 欧美激情成人在线| 一区二区三区蜜桃网| 久久久www免费人成黑人精品| 欧美精品久久久久久久免费观看 | 蜜桃久久精品乱码一区二区| 亚洲精品一二| 久久精品国产欧美激情| 欧美xxx在线观看| 国产精品视频精品| 亚洲国产精品久久久久婷婷老年| 亚洲综合社区| 亚洲欧洲另类| 老司机免费视频久久| 国产精品私人影院| 一本一本久久| 亚洲国产精品成人精品| 欧美一区二区三区在线免费观看| 欧美午夜精品理论片a级按摩 | 久久国产精品电影| 亚洲欧洲在线一区| 久久这里有精品15一区二区三区| 国产精品裸体一区二区三区| 亚洲区一区二区三区| 久久婷婷一区| 亚洲女性裸体视频| 欧美视频久久| 99视频精品全国免费| 欧美激情一区在线| 久久手机免费观看| 国产一区二区毛片| 欧美一区二区三区视频| 亚洲精选在线观看| 欧美片第1页综合| 亚洲精品日韩欧美| 欧美成人dvd在线视频| 久久精品一本久久99精品| 国产精品国产自产拍高清av| 亚洲视频专区在线| 中日韩视频在线观看| 国产精品中文字幕欧美| 欧美在线国产精品| 午夜精品久久| 国内精品久久久久久久影视蜜臀| 久久电影一区| 久久久噜噜噜久噜久久| 亚洲国产精品悠悠久久琪琪| 亚洲第一偷拍| 欧美日韩免费一区二区三区视频| 一区二区免费在线视频| 一区二区三区不卡视频在线观看| 亚洲一区视频在线| 国产精品久久999| 欧美一区二区在线| 久久久久久亚洲精品杨幂换脸| 一区二区三区在线免费播放| 久久精品一区| 美女黄毛**国产精品啪啪| 亚洲另类春色国产| 宅男66日本亚洲欧美视频| 国产麻豆日韩欧美久久| 老司机精品视频网站| 嫩模写真一区二区三区三州| 亚洲一区二区三区乱码aⅴ| 性色av一区二区三区| 亚洲国产91| 亚洲精品综合| 狠狠干狠狠久久| 亚洲精品一区二区三区樱花 | 欧美在线啊v一区| 欧美影院久久久| 日韩视频一区二区在线观看| 亚洲欧美久久| 亚洲经典在线| 亚洲图片你懂的| 亚洲国产日韩欧美在线图片| 99精品国产高清一区二区| 狠狠网亚洲精品| 亚洲私人影院| 亚洲免费观看在线观看| 亚洲视频精选| 亚洲精品国产视频| 亚洲综合精品| 99国产一区| 久久精品国产精品亚洲精品| 亚洲一区免费看| 男同欧美伦乱| 久久色在线播放| 国产精品香蕉在线观看| 日韩视频―中文字幕| 在线欧美福利| 亚洲欧美日韩直播| 亚洲天堂av在线免费观看| 欧美成人dvd在线视频| 亚洲影院色无极综合| 免费成人av在线| 久久激情久久| 国产日韩欧美日韩| 亚洲欧美精品伊人久久| 亚洲一区二区少妇| 欧美日韩免费在线观看| 美女露胸一区二区三区| 国产精品乱人伦中文| 一本综合久久| 一区二区三区日韩| 欧美精品v日韩精品v韩国精品v| 久久综合网色—综合色88| 国产一区自拍视频| 久久精品国产综合精品| 欧美在线欧美在线| 国产精品福利在线观看网址| 最新亚洲一区| 在线亚洲美日韩| 欧美精品一区二区三区蜜桃| 亚洲国产美女精品久久久久∴| 午夜精品三级视频福利| 亚洲欧美激情四射在线日 | 亚洲国产精品一区二区尤物区| 欧美在线999| 久久久亚洲精品一区二区三区 | 午夜日本精品| 亚洲欧美激情诱惑| 国产欧美午夜| 久久国产婷婷国产香蕉| 久久资源av| 伊人久久噜噜噜躁狠狠躁| 葵司免费一区二区三区四区五区| 亚洲综合色激情五月| 国产精品高清在线| 香蕉免费一区二区三区在线观看| 久久国产乱子精品免费女| 狠狠色香婷婷久久亚洲精品| 久久综合福利| 一区二区成人精品| 久久精品人人做人人综合 | 亚洲大片av| 欧美好骚综合网| 99精品热视频只有精品10| 亚洲欧美日韩国产一区二区| 国内精品久久久久久久影视麻豆| 久久亚洲国产成人| 亚洲国产成人精品视频| 在线亚洲高清视频| 国产一区二区久久| 欧美精品三级| 亚洲男女自偷自拍| 免费久久99精品国产自在现线| 日韩亚洲欧美一区| 国产香蕉久久精品综合网| 女女同性精品视频| 亚洲在线观看视频| 欧美大片在线观看| 亚洲一区视频在线观看视频| 精品白丝av| 国产精品mv在线观看| 久久精品一本| 亚洲自拍三区| 亚洲区一区二| 免费av成人在线| 亚洲欧美福利一区二区| 亚洲国产裸拍裸体视频在线观看乱了中文| 欧美日韩国产高清视频| 久久久久久久综合狠狠综合| 亚洲一区免费网站| 亚洲精品免费观看| 欧美1级日本1级| 午夜免费在线观看精品视频| 亚洲麻豆国产自偷在线| 国产在线播精品第三| 国产精品无人区| 欧美日韩国产成人高清视频| 久久久精品视频成人| 亚洲欧美网站| 亚洲女性喷水在线观看一区| 一区二区国产日产| 亚洲国产三级网| 欧美韩日精品| 久久综合九色综合久99|