ffmpeg播放视频音频(ffmpeg 3.0之前老版本)

转载 2012年03月29日 16:48:58
void CProgram::Test()
{
    avcodec_init();
    av_register_all();

    AVFormatContext *pFormatCtx; 
    int i, videoStream; 
    int audioStream; 

    const char *input_file_name = "F:\\fashion_100M.ts"; 

    // Open video file 
    if(av_open_input_file(&pFormatCtx, input_file_name, NULL, 0, NULL)!=0) 
        return ; 

    // Retrieve stream information 
    if(av_find_stream_info(pFormatCtx) < 0) 
        return ; 

    // Find the first video stream 
    videoStream = -1; 
    audioStream = -1; 
    for(i = 0; i < pFormatCtx->nb_streams; i++) 
    { 
        if(pFormatCtx->streams[i]->codec->codec_type == CODEC_TYPE_VIDEO) 
        { 
            videoStream = i; 
        } 
        else if(pFormatCtx->streams[i]->codec->codec_type == CODEC_TYPE_AUDIO) 
        { 
            audioStream = i; 
        } 
    } 
    if(videoStream == -1) 
    { 
        return ; 
    } 

    AVCodecContext  *pVideoCodecCtx=pFormatCtx->streams[videoStream]->codec;
    AVCodec         *pVideoCodec=avcodec_find_decoder(pVideoCodecCtx->codec_id);

    AVCodecContext  *pAudioCodecCtx=pFormatCtx->streams[audioStream]->codec;
    AVCodec         *pAudioCodec=avcodec_find_decoder(pAudioCodecCtx->codec_id);


    //打开视频解码器
    if(avcodec_open(pVideoCodecCtx,pVideoCodec) < 0)
    {
        return ; 
    }

    //通知解码器,我们能处理截断的bit流
    if (pAudioCodec->capabilities&CODEC_CAP_TRUNCATED)
    {
        pAudioCodecCtx->flags|=CODEC_FLAG_TRUNCATED;
    }

    //打开音频解码器
    if(avcodec_open(pAudioCodecCtx,pAudioCodec) < 0)
    {
        return ; 
    }

    uint8_t *pktdata;
    int pktsize;
    int out_size = AVCODEC_MAX_AUDIO_FRAME_SIZE;
    uint8_t * inbuf = (uint8_t *)malloc(out_size);


    int nRet=0;
    int nGopPicture=1;
    int nFrameCount=0;
    int nLostFrame=0;

    AVPacket pktData;
    av_init_packet(&pktData);

    while(av_read_frame(pFormatCtx, &pktData) >= 0) 
    { 
        if(pktData.stream_index == videoStream) 
        { 
            AVFrame *pFrame1=avcodec_alloc_frame();

                //解码视频
                nRet=avcodec_decode_video(pVideoCodecCtx,pFrame1,&nGopPicture,pktData.data,pktData.size);

                if ( nGopPicture > 0 )
                {
                                           //将解码出的YUV数据拷贝到自己分配的节点中
                    PYUV_FRAME pYUVFrame=new YUV_FRAME;

                    pYUVFrame->pYFrame=new unsigned char[m_stFileEncodeInfo.pVideoCodecCtx->width*m_stFileEncodeInfo.pVideoCodecCtx->height];
                    pYUVFrame->pUFrame=new unsigned char[m_stFileEncodeInfo.pVideoCodecCtx->width*m_stFileEncodeInfo.pVideoCodecCtx->height/4];
                    pYUVFrame->pVFrame=new unsigned char[m_stFileEncodeInfo.pVideoCodecCtx->width*m_stFileEncodeInfo.pVideoCodecCtx->height/4];

                    unsigned char *pY=pYUVFrame->pYFrame;
                    unsigned char *pU=pYUVFrame->pUFrame;
                    unsigned char *pV=pYUVFrame->pVFrame;

                    //拷贝Y数据
                    for (int i=0;i<m_stFileEncodeInfo.pVideoCodecCtx->height;i++)
                    {
                        memcpy(pY,pFrame1->data[0], m_stFileEncodeInfo.pVideoCodecCtx->width);
                        pFrame1->data[0]+=pFrame1->linesize[0];
                        pY+=m_stFileEncodeInfo.pVideoCodecCtx->width;
                    }

                    //拷贝U数据
                    for (int i=0;i<m_stFileEncodeInfo.pVideoCodecCtx->height/2;i++)
                    {
                        memcpy(pU,pFrame1->data[1], m_stFileEncodeInfo.pVideoCodecCtx->width/2);
                        pFrame1->data[1]+=pFrame1->linesize[1];
                        pU+=m_stFileEncodeInfo.pVideoCodecCtx->width/2;
                    }

                    //拷贝V数据
                    for (int i=0;i<m_stFileEncodeInfo.pVideoCodecCtx->height/2;i++)
                    {
                        memcpy(pV,pFrame1->data[2], m_stFileEncodeInfo.pVideoCodecCtx->width/2);
                        pFrame1->data[2]+=pFrame1->linesize[2];
                        pV+=m_stFileEncodeInfo.pVideoCodecCtx->width/2;
                    }
               
                                           //将节点保存到链表中供DirectDraw显示
                    m_videoPlay.m_csVideoQueueSection.Lock();
                    m_videoPlay.m_listVideoFrame.AddTail(pYUVFrame);
                    m_videoPlay.m_csVideoQueueSection.Unlock();

                    nFrameCount++;
                    TRACE("nGopPicture > 0  成功解码!  %d 帧,nGopPicture值为 %d ,nRet值为 %d ,输入包长为 %d \n",nFrameCount,nGopPicture,nRet,pktData.size);

                }
                else 
                {
                    nLostFrame++;
                    TRACE("-----丢失帧的总数为 %d ,nGopPicture值为 %d ,nRet值为 %d,输入包长为 %d----\n",nLostFrame,nGopPicture,nRet,pktData.size);

                }

            av_free(pFrame1);
        } 
        else if(pktData.stream_index == audioStream) 
        { 
            //解码音频
            int nInSize=pktData.size;
            unsigned char *pInBuff=pktData.data;

            int outSize=AVCODEC_MAX_AUDIO_FRAME_SIZE;
            unsigned char *pOutBuff=new unsigned char[outSize];
            memset(pOutBuff,0,AVCODEC_MAX_AUDIO_FRAME_SIZE);

            nRet=avcodec_decode_audio2(m_stFileEncodeInfo.pAudioCodecCtx,(short*)pOutBuff,&outSize,pInBuff,nInSize);

            if (nRet >= 0)
            {
                                    //将解码得到的PCM数据保存到缓冲区中中供DirectSound播放
                m_audioPlay.m_audioRingBuff.InputData(pOutBuff,outSize);
            }

            delete[] pOutBuff;
            pOutBuff=NULL;

        } 
        // Free the packet that was allocated by av_read_frame 
        av_free_packet(&pktData); 
    } 

    av_close_input_file(pFormatCtx); 

};

FFmpeg 3.0 版发布

本文译至:https://osdn.jp/magazine/16/02/16/155500 开源多媒体框架「FFmpeg」开发团队于2月15日,发布最新稳定版「FFmpeg 3.0」(代号「Eins...
  • robertsong2004
  • robertsong2004
  • 2016年02月17日 19:52
  • 1555

ffmpeg源码简析(十三)ffmpeg API变更 2009-03-01—— 2017-05-09变更

Add:新增的Change/Rename:修改的Deprecate:过时的。以后很有可能删除。Remove:删除的 The last version increases were: libavcode...
  • King1425
  • King1425
  • 2017年05月09日 10:43
  • 1896

ffmpeg所有发布版本下载地址

就是在这里 ffmpeg.org/release
  • H_O_W_E
  • H_O_W_E
  • 2014年02月25日 17:48
  • 1398

ffmpeg历史版本下载地址

http://git.videolan.org/?p=ffmpeg.git;a=tree;h=eacf8613b3c1a650fbe63c7f5bb05aa690708f2c;hb=eacf8613b...
  • hecong129
  • hecong129
  • 2015年05月26日 15:33
  • 1272

FFMPEG的历史版本,版本号1.0

  • 2016年09月02日 09:33
  • 7.52MB
  • 下载

ffmpeg 各个版本下载地址

下载地址:http://ffmpeg.org/releases/ 下载   wget http://ffmpeg.org/releases/ffmpeg-3.3.tar.gz 解压 tar -x...
  • lcalqf
  • lcalqf
  • 2017年04月28日 14:47
  • 5266

ffmpeg_2.8.5 windows版本

  • 2016年08月02日 10:19
  • 8.18MB
  • 下载

编译 ffmpeg 去掉版本号

在上一篇博客我们已经能够编译出ffmpeg 的so库了,但是会带有数字,也就是版本号,正常的是在前面,如果要想android环境下能够正常的使用,还得修改 configure这个配置...
  • renfujiang
  • renfujiang
  • 2017年01月18日 09:36
  • 666

ffmpeg新版与旧版数据结构不同 持续更新.....

avcodec_init -> avcodec_register_all av_open_input_file -> avformat_open_input
  • zwlq1314521
  • zwlq1314521
  • 2014年11月06日 14:36
  • 1227

FFMPEG历史版本3.1.2

  • 2016年09月02日 09:35
  • 8.9MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ffmpeg播放视频音频(ffmpeg 3.0之前老版本)
举报原因:
原因补充:

(最多只允许输入30个字)