【FFmpeg学习】——FFmpeg编码

编码流程图

步骤

1:注册组件
2:猜格式编码
3:查找编码器
4:打开编码器
5:写入头帧
6:像素数据编码成码流数据
7:写码流数据
8:结束编码
9:写尾帧

在这里插入图片描述

FFmpeg编码函数

	av_register_all():注册所有组件。
	av_guess_format():已经注册的最合适的输出格式
	avcodec_find_encoder():查找一个已经注册的音视频编码器
	avcode_open2():打开编码码器
	avformat_write_header():把流头信息写入到媒体文件中
	av_read_frame():读取一帧压缩数据。
	avcodec_send_frame():发送一帧像素数据
	avcodec_receive_packet():接受一帧编码数据
	av_packet_rescale_ts():时间基转换
	av_write_frame():写一帧数据
	flush_encoder():将最后一帧写入文件
	av_write_trailer():把流尾信息写入文件
	av_code_close():关闭流

FF解码代码展示

头文件

这里的头文件需要先引入ffmpeg的相关头文件,这里还需要先配置好ffmpeg库文件的相关环境配置。

环境配置资源链接:https://download.csdn.net/download/weixin_55799469/87788642?spm=1001.2014.3001.5503

头文件代码:

#ifndef ENCODEVIDEO_H
#define ENCODEVIDEO_H
#include<QImage>
#include<QString>
#include<QThread>
#include<QObject>
#include<QDebug>
extern "C"
{
//C语言的引入 C语言编码
#include"libavcodec/avcodec.h"
#include"libavdevice/avdevice.h"
#include"libavfilter/avfilter.h"
#include"libavformat/avformat.h"
#include"libavutil/avutil.h"
#include"libpostproc/postprocess.h"
#include"libswresample/swresample.h"
#include"libswscale/swscale.h"
}
class EncodeVideo
{
public:
    EncodeVideo();
    void register_all();
    void initEncode();
    void encodecVideo(AVFrame *frame);
    void writeTailer();
private:
    AVFormatContext * formatContext;
    AVCodecContext * codecContext;
    AVPacket * pkt;
    int pktIndex;
};

#endif // ENCODEVIDEO_H

.cpp执行文件代码

.cpp文件代码 :

#include "encodevideo.h"

EncodeVideo::EncodeVideo()
{
    register_all();
    this->formatContext=avformat_alloc_context();//初始化
    this->pkt=av_packet_alloc();//初始化
    this->pktIndex=0;
}
//注册组件使用
void EncodeVideo::register_all()
{
    //初始化注册组件
    av_register_all();
}
//初始化编辑器
void EncodeVideo::initEncode()
{
    //1:通过文件的后缀得到最佳的输出格式
    AVOutputFormat *format=av_guess_format(nullptr,"../fileout/Warcraft3_End.H264",nullptr);
    if(format==nullptr)
    {
        qDebug()<<"format is null";
    }
    else{
        qDebug()<<"format sucess";
    }

    //1.1赋值 设置格式 为了编码获取文件时候通过这个对象知道是什么格式
    this->formatContext->oformat=format;
    //2:打开视频流
    int res=avio_open(&(this->formatContext->pb),".H264",AVIO_FLAG_WRITE);
    if(res<0)
    {
         qDebug()<<"avio_open error";
    }
    else{
         qDebug()<<"avio_open sucess";
    }

    //2.1 新建视频流
    AVStream *newStream=avformat_new_stream(this->formatContext,nullptr);
    if(newStream==nullptr)
    {
        qDebug()<<"newStream is null";
    }
    else{
        qDebug()<<"newStream sucess";
    }
    //2.2 设置编码器上下文环境设置信息
    this->codecContext = newStream->codec;
    //2.3 设置基础信息
    this->codecContext->width=800;
    this->codecContext->height=368;
    this->codecContext->bit_rate=579000;//码率 影响视频的大小
    this->codecContext->time_base={1,24};//时间基
    this->codecContext->framerate={24,1};//帧率

    //2.4 一些高级配置
    this->codecContext->gop_size=10;//  I/P/B 10帧为一组
    this->codecContext->qmax=51;//清晰度
    this->codecContext->qmin=10;//清晰度
    this->codecContext->max_b_frames=0;//B帧压缩为0
    this->codecContext->pix_fmt=AV_PIX_FMT_YUV420P;
    this->codecContext->codec_type=AVMEDIA_TYPE_VIDEO;
    this->codecContext->codec_id=format->video_codec;

    //3:查找编码器
    AVCodec *codec=avcodec_find_encoder(this->codecContext->codec_id);
    //3.1打开编码器
    res=avcodec_open2(this->codecContext,codec,nullptr);
    if(res!=0)
    {
        qDebug()<<"avcodec_open2 error";
    }
    else{
        qDebug()<<"avcodec_open2 sucess";
    }

    //4.写头信息
    res=avformat_write_header(this->formatContext,nullptr);
    if(res<0)
    {
        qDebug()<<"avformat_write_header error";
    }
    else{
        qDebug()<<"avformat_write_header sucess";
    }
    qDebug()<<"initEncode sucess";


}
//逐帧编码
void EncodeVideo::encodecVideo(AVFrame *frame)
{
    //5.发送一帧的像素数据给编码器
    int res=avcodec_send_frame(this->codecContext,frame);//发送一帧
    if(res!=0)
    {
        qDebug()<<"avcodec_send_frame error";
        return;
    }
    else{
        qDebug()<<"avcodec_send_frame sucess";
    }
    while(res>=0)
    {
        frame->pts=this->pktIndex++;
        //6.像素数据转换成码流数据
        res=avcodec_receive_packet(this->codecContext,this->pkt);
        if(res!=0)
        {
            qDebug()<<"avcodec_receive_packet error";
            return ;
        }
        else{
            qDebug()<<"avcodec_receive_packet sucess";
        }
        //7.写一帧码流数据到avformatContext
        res=av_interleaved_write_frame(this->formatContext,this->pkt);
        if(res!=0)
        {
            qDebug()<<"av_interleaved_write_frame error";
            return;
        }
        else{
            qDebug()<<"av_interleaved_write_frame sucess";
        }

    }
    av_packet_unref(this->pkt);//释放
}
//写入尾帧
void EncodeVideo::writeTailer()
{
    //8.写入尾信息 到 avformatContext
    av_write_trailer(this->formatContext);
    //9.回收IO资源
    avio_close(this->formatContext->pb);
    //10.释放avfomatContext
    avformat_free_context(this->formatContext);
}

FFmpeg编码的数据结构

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
FFmpeg是一个用于处理多媒体数据的开源框架,其中包含了众多的编解码库,可以支持各种音视频格式的转码、处理和播放。其中,libfdk-aac是一个高质量的AAC音频编码库,它的优势在于输出的音频质量非常高,而且编码速度也比其他编码库要快。 在使用FFmpeg进行音频编码时,默认情况下使用的是libmp3lame编码库,但是在有些情况下,比如需要输出更高质量的音频数据时,就可以考虑使用libfdk-aac编码库,以获得更好的音频输出效果。 下面是使用FFmpeg编译安装libfdk-aac编码库的步骤: 1. 下载libfdk-aac源代码 可以在官网(https://github.com/mstorsjo/fdk-aac)下载最新的libfdk-aac源代码,也可以选择在其他开源镜像网站上下载。 2. 编译安装libfdk-aac 通过以下命令进入libfdk-aac源代码目录,执行configure和make命令进行编译和安装: ``` $ cd /path/to/libfdk-aac $ ./configure --prefix=/usr/local --enable-shared $ make && sudo make install ``` 其中,--prefix=/usr/local表示将libfdk-aac安装到系统默认的库目录下,--enable-shared表示编译生成共享库文件。 3. 配置FFmpeg编译选项 在FFmpeg编译时,需要指定使用libfdk-aac编码库,可以通过以下命令进行配置: ``` $ ./configure --enable-gpl --enable-libfdk-aac --enable-nonfree $ make && sudo make install ``` 其中,--enable-gpl表示启用GPL协议,--enable-libfdk-aac表示启用libfdk-aac编码库,--enable-nonfree表示启用非免费的编码库。 4. 使用libfdk-aac进行音频编码FFmpeg进行音频编码时,需要指定使用libfdk-aac编码库,可以通过以下命令进行操作: ``` $ ffmpeg -i input.wav -c:a libfdk_aac -b:a 128k output.aac ``` 其中,-c:a libfdk_aac表示使用libfdk-aac编码库进行音频编码,-b:a 128k表示设置输出音频的比特率为128kbps。 通过以上步骤,就可以成功地使用libfdk-aac扩展FFmpeg编码功能,获得更高质量的音频输出效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

时光如箫声留念

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值