• 大小: 35.39MB
    文件类型: .rar
    金币: 2
    下载: 0 次
    发布日期: 2024-01-30
  • 语言: 其他
  • 标签: ffmpeg  qt  

资源简介

Windows环境下使用Ffmpeg+Qt Creator开发的简单播放器: (1)声音输出使用PortAudio; (2)视频显示使用SDL2; (3)具备音视频同步; (4)使用QT开发,便于Debug运行查看Ffmpeg各个结构体的变量是如何变化。

资源截图

代码片段和文件信息

#include 
#include 
#include “audio.h“


#include “avpackets_queue.h“
#include “av_clock.h“
#include “video.h“
#include “log.h“

#define AVCODE_MAX_AUDIO_frame_SIZE 192000  /* 1 second of 48khz 32bit audio */

const double kPortAudioLatency  = 0.3;  // 0.3秒,也就是说PortAudio库需要累积0.3秒的数据后才真正播放

#define ERR_STREAM stderr


typedef struct audio_param
{
    AVframe wantframe; // 指定PCM输出格式

    PaStreamParameters *outputParameters;
    PaStream *stream;
    int sampleRate;
    int format;
    PacketQueue audioQueue;     // 音频队列
    int packetEof;              // 数据包已经读取到最后
    int quit;                   // 是否退出线程
    double audiobaseTime;       // 音频base time
    SwrContext *swrCtx;        // 音频PCM格式转换
}T_AudioParam;

static T_AudioParam sAudioParam;


static int _AudioDecodeframe( AVCodecContext *pAudioCodecCtx uint8_t *audioBuf int bufSize  int *packeEof);


void AudioDecodeThread( void *userdata )
{
    FunEntry();

    AVCodecContext *pAudioCodecCtx = (AVCodecContext *) userdata;
    int len1 = 0;
    int audio_size = 0;
    uint8_t audioBuf[AVCODE_MAX_AUDIO_frame_SIZE];

    AVClockDisable();       // 禁止时钟
    while ( sAudioParam.quit != 1 )
    {
        if(sAudioParam.packetEof && sAudioParam.audioQueue.size == 0)
        {
            sAudioParam.quit = 1;
        }
        audio_size = 0;
        if(VideoGetFirstframe())            // 等图像出来后再出声音
        {
            audio_size = _AudioDecodeframe( pAudioCodecCtx audioBuf sizeof(audioBuf) &sAudioParam.packetEof);
        }
        if ( audio_size > 0 )
        {
            AudioPlay(audioBuf audio_size 0);
        }
        else
        {
            std::this_thread::sleep_for(std::chrono::milliseconds(20));     // 没有数据时先休眠20毫秒
        }
    }


    FunExit();
}


// 对于音频来说,一个packet里面,可能含有多帧(frame)数据
/**
 * @brief _AudioDecodeframe
 * @param pAudioCodecCtx
 * @param audioBuf
 * @param bufSize
 * @param packeEof
 * @return
 */
int _AudioDecodeframe( AVCodecContext *pAudioCodecCtx
                       uint8_t *audioBuf int bufSize int *packeEof)
{
    AVPacket packet;
    AVframe *pframe = NULL;
    int gotframe = 0;
    int decodeLen  = 0;
    long  audioBufIndex = 0;
    int convertLength = 0;
    int convertAll = 0;

    if ( PacketQueueTake( &sAudioParam.audioQueue &packet 1 ) < 0 )
    {
        std::this_thread::sleep_for(std::chrono::milliseconds(30));     // 没有取到数据休眠
        return(-1);
    }

    pframe = av_frame_alloc();
    *packeEof = packet.size ? 0: 1;       // 约定使用数据长度为0时来标记packet已经读取完毕

    while ( packet.size > 0 )
    {
        /*
         * pAudioCodecCtx:解码器信息
         * pframe:输出,存数据到frame
         * gotframe:输出。0代表有frame取了,不意味发生了错误。
         * packet:输入,取数据解码。
         */
        decodeLen = avcodec_decode_audio4( pAudioCodecCtx pframe &gotframe &packet );
        if(decodeLen < 0)
        {
            LogError(

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件        814  2018-02-27 18:23  01-simple-player\.gitignore

     文件       1470  2018-03-06 10:09  01-simple-player\01-simple-player.pro

     文件      24050  2018-03-06 18:40  01-simple-player\01-simple-player.pro.user

     文件      11046  2018-03-06 17:01  01-simple-player\audio.cpp

     文件        465  2018-03-06 16:31  01-simple-player\audio.h

     文件       1596  2018-03-06 17:01  01-simple-player\avpackets_queue.cpp

     文件        888  2018-03-06 16:31  01-simple-player\avpackets_queue.h

     文件       1426  2018-03-06 17:03  01-simple-player\av_clock.cpp

     文件        292  2018-03-06 10:09  01-simple-player\av_clock.h

     文件   24510976  2018-02-26 09:14  01-simple-player\dll\avcodec-57.dll

     文件    2011648  2018-02-26 09:14  01-simple-player\dll\avdevice-57.dll

     文件    4290048  2018-02-26 09:14  01-simple-player\dll\avfilter-6.dll

     文件    5145088  2018-02-26 09:14  01-simple-player\dll\avformat-57.dll

     文件     669184  2018-02-26 09:14  01-simple-player\dll\avutil-55.dll

     文件     120334  2017-10-09 11:53  01-simple-player\dll\libgcc_s_dw2-1.dll

     文件    1540622  2015-12-29 06:25  01-simple-player\dll\libstdc++-6.dll

     文件      79360  2015-12-29 06:25  01-simple-player\dll\libwinpthread-1.dll

     文件     667648  2018-02-28 11:56  01-simple-player\dll\portaudio_x86.dll

     文件     116736  2018-02-26 09:14  01-simple-player\dll\postproc-54.dll

     文件    1005056  2018-02-26 09:14  01-simple-player\dll\SDL2.dll

     文件    6636853  2018-02-26 09:14  01-simple-player\dll\source.200kbps.768x320.flv

     文件     293888  2018-02-26 09:14  01-simple-player\dll\swresample-2.dll

     文件     509440  2018-02-26 09:14  01-simple-player\dll\swscale-4.dll

     文件   24510976  2018-02-26 09:14  01-simple-player\ffmpeg\ffmpeg-3.3.3-win32-shared\bin\avcodec-57.dll

     文件    2011648  2018-02-26 09:14  01-simple-player\ffmpeg\ffmpeg-3.3.3-win32-shared\bin\avdevice-57.dll

     文件    4290048  2018-02-26 09:14  01-simple-player\ffmpeg\ffmpeg-3.3.3-win32-shared\bin\avfilter-6.dll

     文件    5145088  2018-02-26 09:14  01-simple-player\ffmpeg\ffmpeg-3.3.3-win32-shared\bin\avformat-57.dll

     文件     669184  2018-02-26 09:14  01-simple-player\ffmpeg\ffmpeg-3.3.3-win32-shared\bin\avutil-55.dll

     文件     281600  2018-02-26 09:14  01-simple-player\ffmpeg\ffmpeg-3.3.3-win32-shared\bin\ffmpeg.exe

     文件    1258496  2018-02-26 09:14  01-simple-player\ffmpeg\ffmpeg-3.3.3-win32-shared\bin\ffplay.exe

............此处省略343个文件信息

评论

共有 条评论