FFmpeg:因码流采集与封装不同步导致录制出来的MP4文件会出现黑屏、绿屏的问题

项目要求实时播放视频,并且需要支持播放中途可以录制视频。但是录制出来的文件会黑屏,过一段时间后正常显示。即:码流采集--->播放--->(一段时间后)录制MP4,黑屏出现的时间就在采集到录制之前。

黑屏现象

原因:

将码流封装成文件主要是通过这个接口实现的

cpp 复制代码
av_interleaved_write_frame(formatContext, &packet);

当开始录制时,传入的packet的pts(播放时间戳)不是从0开始,而视频的播放一般是从0开始播放,所以导致在没到pts时都是显示黑屏。

解决办法:对首帧时间戳进行了归零调整,相关代码如下

cpp 复制代码
int media::saveVideo(AVFormatContext *iFormatContext, AVPacket &packet)
{
    //写入的第一帧需要是关键帧,否则前面部分会花屏或者绿屏
    if(!firstKeyFrame){
        if(!(packet.flags & AV_PKT_FLAG_KEY)){
            return -1;
        }else{
            firstKeyFrame = true;
        }
    }

    qDebug() << "fwefvwae" << "调整前时间戳pts" << packet.pts;

    //调整时间戳从0开始
    if(isNewRecode){
        adjust_dts = packet.dts;
        adjust_pts = packet.pts;
        isNewRecode = false;
    }

    packet.dts -= adjust_dts;  //关键处理
    packet.pts -= adjust_pts;

    qDebug() << "fwefvwae" << "调整后时间戳pts" << packet.pts;

    dts = packet.dts;
    frame_count++;
    //视频数据写文件
    int ret;
    ret = av_interleaved_write_frame(formatContext, &packet);
    if(ret < 0){
        printErrInfo("MediaRecord av_interleaved_write_frame ", ret);
    }

    return ret;
}

如果出现绿屏情况,是因为录制视频时传入的第一帧不是关键帧

相关推荐
源之缘-OFD先行者6 天前
破界渲染:WinForm下的FFmpeg+Vortice极速推流引擎
ffmpeg·winform·推流·h264
源来猿往6 天前
记ffmpeg-8.1.1 之Android库编译(window)
android·ffmpeg
Deitymoon6 天前
RV1126+FFMPEG多路码流监控项目
ffmpeg·音视频
芝麻别开门6 天前
GStreamer DASH Demux 知识文档
ffmpeg·dash
ltlovezh7 天前
ROI 编码学习指南:Android 与 FFmpeg 的真实实现边界
android·ffmpeg·音视频开发
m0_747124538 天前
多媒体框架 FFmpeg 和 GStreamer
ffmpeg·gstreamer
小鹿研究点东西8 天前
AI直播系统怎么搭?
人工智能·ffmpeg·自动化·音视频·语音识别
Nightwish58 天前
Oracle 数据库巡检检查清单
数据库·oracle·ffmpeg
luoyayun3619 天前
Qt/QML + FFmpeg 实现多音频文件顺序拼接功能
qt·ffmpeg·音频拼接
wbcuc9 天前
ffmpeg工具把m4s合并为mp4 powershell脚本
ffmpeg·m4s