FFmpeg将视频包AVPacket通过视频流方式写入本地文件

1.写视频头

cpp 复制代码
void writeVideoHeader(const char* videoFileName){
    int r = avformat_alloc_output_context2(&pFormatCtx, nullptr, nullptr,videoFileName);
    if(r < 0){
        qDebug()<<"Error: avformat_alloc_output_context2: "<<av_err2str(r);
        return;
    }
    pStream = avformat_new_stream(pFormatCtx,nullptr);
    qDebug()<<"创建视频流成功";
    pFormatCtx->streams[0]->codecpar->width = 1280;
    pFormatCtx->streams[0]->codecpar->height = 720;
    AVCodecContext *c= pStream->codec;
    c->codec_type = AVMEDIA_TYPE_VIDEO;
    c->codec_id = AV_CODEC_ID_H264;
    c->bit_rate = 2000000;
    c->width = 1080;
    c->height = 720;
    c->time_base.num = 1;
    c->time_base.den = 30;
    qDebug()<<"配置解码器选项成功";
    r = avio_open(&pFormatCtx->pb, videoFileName, AVIO_FLAG_WRITE);
    if(r < 0){
        qDebug()<<"Error: avio_open: "<<av_err2str(r);
        return;
    }
    qDebug()<<"打开视频流成功";
    r = avformat_write_header(pFormatCtx, nullptr);
    if(r < 0){
        qDebug()<<"Error: avformat_write_header error"<<av_err2str(r)<<r;
        return;
    }
    qDebug()<<"写入视频头部信息成功";
}

2.写视频帧

cpp 复制代码
void writeAVFrame(AVPacket *packet){
    qDebug()<<"原始视频帧信息:"<<packet->pts<<packet->dts<<packet->size;
    int64_t video_max_pts = 0;
    av_packet_rescale_ts(packet, pStream->time_base, pStream->time_base);
    packet->stream_index = 0;
    video_max_pts = qMax(packet->pts, video_max_pts);
    qDebug("视频:PTS-> %d %d %d",packet->pts,packet->dts, &pStream->time_base);
    qDebug()<<"计算时间基成功";
    int r=av_write_frame(pFormatCtx, packet);
    if (r<0) {
        qDebug()<<"Error: av_write_frame: "<<av_err2str(r);
        return;
    }
    qDebug()<<"写入视频帧成功";
}

3.关闭视频流

cpp 复制代码
if(pFormatCtx){
                    av_write_trailer(pFormatCtx);
                    avio_close(pFormatCtx->pb);
                    avformat_free_context(pFormatCtx);
                }
相关推荐
cuijiecheng20182 小时前
音视频入门基础:FLV专题(13)——FFmpeg源码中,解析任意Type值的SCRIPTDATAVALUE类型的实现
ffmpeg·音视频
Envyᥫᩣ3 小时前
《ASP.NET Web Forms 实现视频点赞功能的完整示例》
前端·asp.net·音视频·视频点赞
HJ_SDK10 小时前
探索私有化聊天软件:即时通讯与音视频技术的结合
音视频
jndingxin21 小时前
OpenCV视频I/O(8)视频采集类VideoCapture之从视频源中读取一帧图像函数read()的使用
人工智能·opencv·音视频
SEU-WYL1 天前
基于深度学习的视频生成
人工智能·深度学习·音视频
小神.Chen1 天前
YouTube音视频合并批处理基于 FFmpeg的
ffmpeg·音视频
EasyCVR1 天前
安防监控/视频系统EasyCVR视频汇聚平台如何过滤134段的告警通道?
网络协议·音视频·视频编解码·视频监控·gb28181
Q8343158191 天前
华为 海思22AP10(SS524)H.265 编解码处理器用户指南
arm开发·人工智能·嵌入式硬件·音视频·硬件工程·h.265·视频编解码
PlumCarefree2 天前
mp4(H.265编码)转为本地RTSP流
音视频·harmonyos·h.265
Lijunyan12982 天前
Python、C++、java阶乘算法
python·其他·音视频·twitter·segmentfault