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++; 声音比较均匀,就用上面的方式就可以。