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

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

相关推荐
封奚泽优1 天前
下载网页中的.m3u8视频文件
ffmpeg
Vertira1 天前
win10/10 下载并安装ffmpeg.exe 的官方详细方法 (已解决)
ffmpeg
xmRao1 天前
Qt+FFmpeg 实现音频重采样
qt·ffmpeg·音视频
Evonso3 天前
静态编译的ffmpeg用法
ffmpeg
_chirs4 天前
编译不依赖动态库的FFMPEG(麒麟国防 V10)
arm开发·ffmpeg
熊猫钓鱼>_>4 天前
从零到一:打造“抗造” Electron 录屏神器的故事
前端·javascript·ffmpeg·electron·node·录屏·record
UpYoung!4 天前
【格式转换工具】专业级多媒体格式转换解决方案——Freemake Video Converter 完全指南:轻量化视频剪辑媒体格式转换
ffmpeg·短视频·实用工具·开源工具·多媒体格式转换·运维必备·视频转换格式
试剂小课堂 Pro5 天前
Ald-PEG-Ald:丙醛与聚乙二醇两端连接的对称分子
java·c语言·c++·python·ffmpeg
MaoSource5 天前
Debian 12 安装 FFmpeg 命令
服务器·ffmpeg·debian
白云千载尽6 天前
交换空间扩容与删除、hugginface更换默认目录、ffmpeg视频处理、清理空间
python·ffmpeg·控制·mpc·navsim