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;
}

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

相关推荐
xcLeigh19 小时前
KingbaseES 的卢智能运维体架构深度拆解
运维·数据库·人工智能·ai·架构·ffmpeg·智能体
程序员老陆1 天前
FFmpeg6 在 Windows 打开麦克风并录成 PCM:不走 Qt Multimedia,也不碰 WASAPI
windows·ffmpeg·音视频·pcm
程序员老陆2 天前
从零写一个 FFmpeg 播放器:架构设计远比“解码显示”复杂
ffmpeg·音视频·播放器
程序员老陆2 天前
FFmpeg 硬解在 Linux 上:从“能跑”到“跑满 GPU”的实战笔记
linux·笔记·ffmpeg
≮傷£≯√3 天前
移植ffmpeg 到 GEC6818
ffmpeg
海带紫菜菠萝汤4 天前
FFmpeg.wasm 实践:在浏览器中运行 FFmpeg 的能力边界与性能瓶颈
前端·javascript·ffmpeg·音视频·wasm
程序员老陆5 天前
FFmpeg6的滤镜函数解析
ffmpeg·音视频·avfilter
看浪的路人5 天前
第10讲:Python 调用 FFmpeg 批量处理——打造你的视频处理工具箱
python·ffmpeg·音视频
程序员老陆6 天前
FFmpeg 时间戳全解:从 av_rescale_q 到时间基黑洞
ffmpeg·音视频·时间基
水獭比特6 天前
自动成片没报错,为什么音画还会漂?
ffmpeg