ZBLOG

C++ FFMPEG 解码MP4

使用 C++ 和 FFmpeg 解码 MP4 文件通常需要安装 FFmpeg 库,并使用其 API 来读取和解码视频流。以下是一个简单的示例,演示如何用 C++ 使用 FFmpeg 解码 MP4 视频文件。

环境准备

  1. 安装 FFmpeg: 在你的系统上安装 FFmpeg 开发库。如果你在 Ubuntu 上,可以使用以下命令:
   sudo apt-get install libavcodec-dev libavformat-dev libavutil-dev
  1. 创建一个 C++ 项目
  2. 链接 FFmpeg 库

示例代码

下面是一个基本的示例,展示如何打开一个 MP4 文件并解码其中的视频帧:

extern "C" {
#include <libavformat/avformat.h>
#include <libavcodec/avcodec.h>
}

#include <iostream>

int main() {
    // 注册所有的编解码器和格式
    av_register_all();

    // 打开输入文件(MP4)
    const char* inputFileName = "input.mp4";
    AVFormatContext* formatContext = nullptr;

    if (avformat_open_input(&formatContext, inputFileName, nullptr, nullptr) != 0) {
        std::cerr << "Could not open the file: " << inputFileName << std::endl;
        return -1;
    }

    // 查找流信息
    if (avformat_find_stream_info(formatContext, nullptr) < 0) {
        std::cerr << "Could not find stream information." << std::endl;
        return -1;
    }

    // 查找视频流索引
    int videoStreamIndex = -1;
    for (unsigned int i = 0; i < formatContext->nb_streams; i++) {
        if (formatContext->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
            videoStreamIndex = i;
            break;
        }
    }

    if (videoStreamIndex == -1) {
        std::cerr << "Could not find a video stream." << std::endl;
        return -1;
    }

    // 获取解码器上下文
    AVCodecParameters* codecParameters = formatContext->streams[videoStreamIndex]->codecpar;
    AVCodec* codec = avcodec_find_decoder(codecParameters->codec_id);
    
    if (!codec) {
        std::cerr << "Unsupported codec!" << std::endl;
        return -1;
    }

    AVCodecContext* codecContext = avcodec_alloc_context3(codec);
    
    if (!codecContext) {
        std::cerr << "Could not allocate codec context." << std::endl;
        return -1;
    }
    
     // 将参数复制到上下文中 
     if (avcodec_parameters_to_context(codecContext, codecParameters) < 0) { 
         std::cerr << "Failed to copy codec parameters to context."<<std::endl; 
         return -1; 
     } 

     // 打开解码器
     if (avcodec_open2(codecContext, codec, nullptr) < 0) { 
         std::cerr <<"Failed to open decoder."<<std::endl; 
         return -1; 
     } 

     // 解码循环
     AVPacket packet; 
     AVFrame* frame = av_frame_alloc(); 

     while(av_read_frame(formatContext, &packet)>=0){ 

         // 检查是否为视频包 
         if(packet.stream_index==videoStreamIndex){  
             int response= avcodec_send_packet(codecContext,&packet);   
             if(response>=0){  
                 while(response>=0){  
                     response= avcodec_receive_frame(codecContext,frame);  
                     if(response==AVERROR(EAGAIN)||response==AVERROR_EOF){  
                         break;  
                     }else if(response<0){  
                         std::cout<<"Error while receiving a frame from decoder."<<std::endl;  
                         break;  
                     }  

                     // 成功接收帧后,这里可以处理帧,例如显示或保存图像数据
                     printf("Received frame %d\n", codecContext->frame_number);  

                 }  
             }else{   
                std::cout<<"Error while sending a packet to decoder."<<std::endl;   
                break;     
            }     
       }
       av_packet_unref(&packet); 
   }  

   // 清理资源
   av_frame_free(&frame);
   avcodec_free_context(&codecContext);
   avformat_close_input(&formatContext);

   return 0;
}

编译和运行

确保将程序编译为与 FFmpeg 链接。例如,如果你正在使用 g++,可以通过以下命令编译:

g++ decode_mp4.cpp -o decode_mp4 -lavformat -lavcodec -lavutil

然后运行生成的可执行文件:

./decode_mp4

注意事项

  • 此代码示例只是基础框架,你可能还需要处理错误情况、释放内存等。
  • 根据不同平台和环境,FFmpeg 的包含路径和链接方式可能会有所不同,请根据实际情况调整。

希望这个示例能帮助你开始使用 C++ 和 FFmpeg 解码 MP4 文件!如果有更多问题,请随时问我。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://sdn.0voice.com/?id=7706

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?