資源簡介
是一個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個文件信息
評論
共有 條評論