• 大小: 15.25MB
    文件类型: .zip
    金币: 2
    下载: 0 次
    发布日期: 2024-01-31
  • 语言: 其他
  • 标签: SDL播放  

资源简介

是一个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个文件信息

评论

共有 条评论