资源简介
是一个Windows下使用FFMPEG解码AAC文件并使用SDL播放的简单例子
FFMPEG的版本是2.5.2
SDL的版本是2.04
关于代码的解释 请参考:
http://blog.yundiantech.com/?log=blog&id=10
代码片段和文件信息
/**
* 叶海辉
* QQ群121376426
* http://blog.yundiantech.com/
*/
extern “C“
{
#include “libavcodec/avcodec.h“
#include “libavformat/avformat.h“
#include “libavutil/pixfmt.h“
#include “libswscale/swscale.h“
#include
#include
#include
#include
#include
#include
}
#include
#include
using namespace std;
extern “C“
{
#include “libavcodec/avcodec.h“
#include “libavformat/avformat.h“
#include “libswscale/swscale.h“
#include “libavdevice/avdevice.h“
}
///由于我们建立的是C++的工程
///编译的时候使用的C++的编译器编译
///而FFMPEG是C的库
///因此这里需要加上extern “C“
///否则会提示各种未定义
#define SDL_AUDIO_BUFFER_SIZE 1024
#define AVCODEC_MAX_AUDIO_frame_SIZE 192000 // 1 second of 48khz 32bit audio
typedef struct PacketQueue {
AVPacketList *first_pkt *last_pkt;
int nb_packets;
int size;
SDL_mutex *mutex;
SDL_cond *cond;
} PacketQueue;
// 分配解码过程中的使用缓存
AVframe* audioframe = avcodec_alloc_frame();
PacketQueue *audioq;
void packet_queue_init(PacketQueue *q) {
memset(q 0 sizeof(PacketQueue));
q->mutex = SDL_CreateMutex();
q->cond = SDL_CreateCond();
}
int packet_queue_put(PacketQueue *q AVPacket *pkt) {
AVPacketList *pkt1;
if (av_dup_packet(pkt) < 0) {
return -1;
}
pkt1 = (AVPacketList*)av_malloc(sizeof(AVPacketList));
if (!pkt1)
return -1;
pkt1->pkt = *pkt;
pkt1->next = NULL;
SDL_LockMutex(q->mutex);
if (!q->last_pkt)
q->first_pkt = pkt1;
else
q->last_pkt->next = pkt1;
q->last_pkt = pkt1;
q->nb_packets++;
q->size += pkt1->pkt.size;
SDL_CondSignal(q->cond);
SDL_UnlockMutex(q->mutex);
return 0;
}
static int packet_queue_get(PacketQueue *q AVPacket *pkt int block) {
AVPacketList *pkt1;
int ret;
SDL_LockMutex(q->mutex);
for (;;) {
pkt1 = q->first_pkt;
if (pkt1) {
q->first_pkt = pkt1->next;
if (!q->first_pkt)
q->last_pkt = NULL;
q->nb_packets--;
q->size -= pkt1->pkt.size;
*pkt = pkt1->pkt;
av_free(pkt1);
ret = 1;
break;
} else if (!block) {
ret = 0;
break;
} else {
SDL_CondWait(q->cond q->mutex);
}
}
SDL_UnlockMutex(q->mutex);
return ret;
}
int audio_decode_frame(AVCodecContext *aCodecCtx uint8_t *audio_buf int buf_size)
{
static AVPacket pkt;
static uint8_t *audio_pkt_data = NULL;
static int audio_pkt_size = 0;
int len1 data_size;
for(;;)
{
if(packet_queue_get(audioq &pkt 1) < 0)
{
return -1;
}
audio_pkt_data = pkt.data;
audio_pkt_size = pkt.size;
while(audio_pkt_size > 0)
{
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
目录 0 2016-09-09 22:22 testFFmpeg+SDL\
目录 0 2016-09-09 20:28 testFFmpeg+SDL\ffmpeg\
目录 0 2016-09-09 20:28 testFFmpeg+SDL\ffmpeg\bin\
文件 19646464 2014-12-31 06:21 testFFmpeg+SDL\ffmpeg\bin\avcodec-56.dll
文件 1367552 2014-12-31 06:21 testFFmpeg+SDL\ffmpeg\bin\avdevice-56.dll
文件 2314752 2014-12-31 06:21 testFFmpeg+SDL\ffmpeg\bin\avfilter-5.dll
文件 5839360 2014-12-31 06:21 testFFmpeg+SDL\ffmpeg\bin\avformat-56.dll
文件 452096 2014-12-31 06:21 testFFmpeg+SDL\ffmpeg\bin\avutil-54.dll
文件 324608 2014-12-31 06:21 testFFmpeg+SDL\ffmpeg\bin\ffmpeg.exe
文件 475136 2014-12-31 06:21 testFFmpeg+SDL\ffmpeg\bin\ffplay.exe
文件 152576 2014-12-31 06:21 testFFmpeg+SDL\ffmpeg\bin\ffprobe.exe
文件 121344 2014-12-31 06:21 testFFmpeg+SDL\ffmpeg\bin\postproc-53.dll
文件 270336 2014-12-31 06:21 testFFmpeg+SDL\ffmpeg\bin\swresample-1.dll
文件 446976 2014-12-31 06:21 testFFmpeg+SDL\ffmpeg\bin\swscale-3.dll
目录 0 2016-09-09 20:28 testFFmpeg+SDL\ffmpeg\include\
目录 0 2016-09-09 20:28 testFFmpeg+SDL\ffmpeg\include\libavcodec\
文件 179819 2014-12-31 06:21 testFFmpeg+SDL\ffmpeg\include\libavcodec\avcodec.h
文件 3111 2014-12-31 06:21 testFFmpeg+SDL\ffmpeg\include\libavcodec\avfft.h
文件 3764 2014-12-31 06:21 testFFmpeg+SDL\ffmpeg\include\libavcodec\dv_profile.h
文件 2358 2014-12-31 06:21 testFFmpeg+SDL\ffmpeg\include\libavcodec\dxva2.h
文件 10623 2014-12-31 06:21 testFFmpeg+SDL\ffmpeg\include\libavcodec\old_codec_ids.h
文件 4007 2014-12-31 06:21 testFFmpeg+SDL\ffmpeg\include\libavcodec\vaapi.h
文件 5437 2014-12-31 06:21 testFFmpeg+SDL\ffmpeg\include\libavcodec\vda.h
文件 7094 2014-12-31 06:21 testFFmpeg+SDL\ffmpeg\include\libavcodec\vdpau.h
文件 6340 2014-12-31 06:21 testFFmpeg+SDL\ffmpeg\include\libavcodec\version.h
文件 2317 2014-12-31 06:21 testFFmpeg+SDL\ffmpeg\include\libavcodec\vorbis_parser.h
文件 6062 2014-12-31 06:21 testFFmpeg+SDL\ffmpeg\include\libavcodec\xvmc.h
目录 0 2016-09-09 20:28 testFFmpeg+SDL\ffmpeg\include\libavdevice\
文件 16642 2014-12-31 06:21 testFFmpeg+SDL\ffmpeg\include\libavdevice\avdevice.h
文件 1859 2014-12-31 06:21 testFFmpeg+SDL\ffmpeg\include\libavdevice\version.h
目录 0 2016-09-09 20:28 testFFmpeg+SDL\ffmpeg\include\libavfilter\
............此处省略189个文件信息
评论
共有 条评论