【FFMPEG应用篇】基于FFmpeg的转码应用(FLV MP4)

 方法声明

extern "C"   //ffmpeg使用c语言实现的,引入用c写的代码就要用extern
{
#include    //注册
#include   //设备
#include 
#include 
#include 
#include 
}
#include

class fcoverh264
{
public:
    fcoverh264(int number);

    //打开H264视频文件
    void openFile(std::string file);
    //根据我们需要的封装格式进行处理
    void outPut(std::string fileout);
private:
    AVFormatContext* forContext, * formatout;//保存数据的结构体 forContext存输入进来的视频信息;formatout存储最终输出的视频信息
    AVPacket* pkt;//pkt
    int videoType;
};

 定义实现 

#include "fcoverh264.h"


extern "C"   //ffmpeg使用c语言实现的,引入用c写的代码就要用extern
{
#include    //注册
#include   //设备
#include 
#include 
#include 
#include 
}
fcoverh264::fcoverh264(int number):videoType(number)
{
    /*
     * 转码的流程:
     * 1.注册组件
     * 2.打开视频流 打开视频文件
     * 3.查找有没有流数据
     * 4.查找视频码流数据
     *
     * 6.根据要的封装格式 来猜测格式对应编辑器
     * 7.打开对应文件
     * 8.新建流
     * 9.写入头部信息
     * 10.读取一帧一帧的码流数据
     * 11.转码---->时间基的转化
     * 所以在解码的时候:显示顺序和解码的顺序是一样的;
       处理其他视频的时候:就需要关注 显示顺序和解码的顺序是否一致了
       编码有B帧? 解码:IPB
     * 12.写入对应的一帧数据到文件中
     */

     //注册组件
    av_register_all();
    forContext = avformat_alloc_context();

}

void fcoverh264::openFile(std::string file)
{
    //打开输入视频
    int res = avformat_open_input(&forContext, file.c_str(), nullptr, nullptr);
    //判断是否打开成功
    if (res < 0)
    {
        std::cout << "打开失败"<nb_streams; i++) //i小于流的个数
    {
        if (forContext->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO)//视频流
        {
            videoType = i;//标识类型
            break;
        }
    }
    if (videoType == -1)
    {
        std::cout << "没有视频流相关信息" << std::endl;
        return;
    }
    std::cout << "输入的准备已经完成"<oformat = avformat;

    //打开视频流 文件流
    //参数1:输入输出的上下文对象
    //参数2:文件流路径
    //参数3:文件打开格式 写的方式
    int res = avio_open(&formatout->pb, fileout.c_str(), AVIO_FLAG_WRITE);
    if (res < 0)
    {
        std::cout << "open file error"<codecpar, forContext->streams[videoType]->codecpar);
    std::cout << "res=" << res<

 调用实例

#include 
#include "fcoverh264.h"


int main() {

    fcoverh264* cover = new fcoverh264{-1};       //转码
    cover->openFile("test01.h264");
    cover->outPut("code_frame.flv");

    return 0;
}

你可能感兴趣的:(FFmpeg从入门到入土,ffmpeg)