yang131

导航

ffmpeg一些笔记: 代码调试数据

1.AAC,MP3他的解码数据格式不支持,程序中给的是这个AV_SAMPLE_FMT_FLTP,  Screen-Cpature-Recoder的codec-id为AV_CODEC_RAW_VIDEO,virtual-audio-capturer的codec-id为AV_CODEC_FIRST_AUDIO,声音默认的数据格式不支持aac,mp3

2.mp4文件解码 25fps的视频,在写完write header之后,time_base是1/12800
也就是说他的dts/pts 间隔512,比如0,512,1024,1536
公式如下:
1.0 / (512* 1 / 12800) = 25 fps

3.我们在自己组织MP4的时候实际上可以用av_get_time()来定义dts,pts。

      公式为   (av_get_time() / 1000 - enc_start_time) / time_base;     time_base分别对应相应stream的 video,audio的time_base

 

4.在编码的时候,有AVFrame这个变量,而这个根据提示需要把pix_fmt设置成YUV_420P

5. video时CodecContext的有效拷贝:

void CopyVideoCodecContext(AVCodecContext* decAvc, AVCodecContext* avc)
    {
        avc->pix_fmt = decAvc->pix_fmt;
        avc->width = decAvc->width;
        avc->height = decAvc->height;
        avc->coded_width = decAvc->width;
        avc->coded_height = decAvc->height;
        avc->gop_size = 30;//decAvc->gop_size;
        avc->max_b_frames = decAvc->max_b_frames;
        avc->sample_aspect_ratio =  avc->sample_aspect_ratio;

        avc->bit_rate = decAvc->bit_rate;
        avc->time_base = decAvc->time_base;
        avc->framerate = decAvc->framerate;

    }

 audio时CodecContext的有效拷贝:

void CopyAudioCodecContext(AVCodecContext* decAvc, AVCodecContext* avc)
    {
        avc->sample_fmt = decAvc->sample_fmt;
        avc->bit_rate = decAvc->bit_rate;
        avc->sample_rate = decAvc->sample_rate;
        avc->channel_layout =  decAvc->channel_layout;
        avc->time_base = decAvc->time_base;
        avc->channels = av_get_channel_layout_nb_channels(decAvc->channel_layout);
    }

 6.关于导出MP4文件 dts和pts取值问题,2种方式:

    1.使用(av_gettime() / 1000.0 - (double)audiostart_time) / 1000.f / av_q2d(ast->time_base);   这种方式视频报错,原因可能是编码时有高延迟导致的帧率不均匀。

     2.给顶一个frameid,然后  dts =(frameid-2)*512,pts =   frameid* 512;  frameid++; 声音比较均匀,就用上面的方式就可以。

posted on 2022-11-12 22:38  NoNight  阅读(44)  评论(0编辑  收藏  举报