ffmpeg封装h264裸流为mp4文件,视频播放速度特别慢-解决

目录

ffmpeg封装h264裸流为mp4文件,视频播放速度特别慢-解决

FFmpeg RTSP流存mp4 代码


ffmpeg封装h264裸流为mp4文件,视频播放速度特别慢-解决

计算实际帧率时,需要从mp4的moov box中的mvhd中取得timescale和duration,将两者相除得到文件总时长,

再从stsz box中取得sample总数,即总帧数sample_count,用总帧数除以总时长即平均帧率,计算公式为

frame_rate = sample_count/(duration/timescale)
 

解决方法:通过查询mp4帧率计算得到答案:

AVDictionary* opt = NULL;

av_dict_set(&opt, "video_track_timescale", "90000", 0);

备注:

AVDictionary *opt=NULL;
av_dict_set_int(&opt,"video_track_timescale",25,0);
ret=avformat_write_header(ofmt_ctx,&opt);
而且pts只能+1递增。时间基没有设置也能十分正常播放。

timescale指一秒钟按时钟滴答数计算是多少,如果你设置1000,则一秒钟是以1000计算,你设置成25,那一秒钟就以25计算,所以你pts只能+1。 因为你设置了video_track_timescale所以不需要设置时间基

保存帧:

int mp4savePacket(int status,AVPacket *tmppacket){

            tmppacket->flags |= AV_PKT_FLAG_KEY;
            tmppacket->pts +=last_pts;
           // tmppacket->pts = av_rescale_q((frame_num)*30000, outfmt_ctx->streams[0]->codec->time_base,outfmt_ctx->streams[0]->time_base);//替换了
            frame_num++;
            tmppacket->dts += last_dts;
            tmppacket->stream_index = 0;
            tmppacket->duration=1;
            LOGE(3,"record_status ok,record_status = %d frame index %d %d %d\n",record_status,frame_num, tmppacket->duration,tmppacket->pts);

            //LOGE(3,"mpacket, 16Byte = %d,%d ",tmppacket.data[0],tmppacket.data[1]);
            av_interleaved_write_frame(outfmt_ctx, tmppacket);
            av_free_packet(tmppacket);

FFmpeg RTSP流存mp4 代码

使用FFmpeg接收RTSP流并存为mp4 - 简书

ffmpeg读取rtsp并保存到mp4文件_ffmpeg rtsp 流写入mp4-CSDN博客

https://www.cnblogs.com/wenjingu/p/3990071.html 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AI算法网奇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值