[Libav-user] RTSP stream capture lost seeking and speed

classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

[Libav-user] RTSP stream capture lost seeking and speed

Dnii Volna
    i'm trying capture rtsp stream (h264) to local file and there is 3 problem.
1) sometimes (usually at the stream starts) i got pts,dts values of packet incorrect (non monotonically increasing)
2) output file has no seeking information
3) output file speed seems 1.5x lower than rtsp source
any avice please

    AVFormatContext* inFormatCtx = avformat_alloc_context();
    if (avformat_open_input(&inFormatCtx,m_RTSPPath.toLocal8Bit().data(),nullptr,nullptr))  return;
    if (avformat_find_stream_info(inFormatCtx,nullptr) < 0)  return;

    int videoStreamIdx = av_find_best_stream(inFormatCtx,AVMEDIA_TYPE_VIDEO,-1,-1,nullptr,0);
    if (videoStreamIdx == -1) return;

    AVStream *inVideoStream = inFormatCtx->streams[videoStreamIdx];
    av_dump_format(inFormatCtx,videoStreamIdx,nullptr,0);
    av_read_play(inFormatCtx);

    AVFormatContext *outFormatCtx = nullptr;
    QString filename = m_archivePath + "/" + QDateTime::currentDateTime().toString(m_dateTimeFormat);

    if (avformat_alloc_output_context2(&outFormatCtx,nullptr,"avi",filename.toLocal8Bit().data()))  return;

    AVStream *outVideoStream = avformat_new_stream(outFormatCtx,nullptr);
    if (avcodec_parameters_copy(outVideoStream->codecpar,inVideoStream->codecpar) < 0)  return;

    if (!(outFormatCtx->oformat->flags & AVFMT_NOFILE) &&
       (avio_open(&outFormatCtx->pb,filename.toLocal8Bit().data(),AVIO_FLAG_WRITE)<0)) return;

    if (avformat_write_header(outFormatCtx,nullptr) < 0) return;
  
    AVPacket packet;
    int count = 10000;
    while (count--) {
        if (av_read_frame(inFormatCtx,&packet) < 0) continue;

        if (videoStreamIdx != packet.stream_index) {
            av_packet_unref(&packet);
            continue;
        }

        qInfo()<<"<<<<<<<"<<packet.stream_index<<packet.pts<<packet.dts;

        packet.pts = av_rescale_q_rnd(packet.pts,
                                      inVideoStream->time_base,
                                      outVideoStream->time_base,
                                      static_cast<AVRounding>(AV_ROUND_NEAR_INF|AV_ROUND_PASS_MINMAX));
        packet.dts = av_rescale_q_rnd(packet.dts,
                                      inVideoStream->time_base,
                                      outVideoStream->time_base,
                                      static_cast<AVRounding>(AV_ROUND_NEAR_INF|AV_ROUND_PASS_MINMAX));
        packet.duration = av_rescale_q(packet.duration,
                                       inVideoStream->time_base,
                                       outVideoStream->time_base);
        packet.stream_index = outVideoStream->id;

        qInfo()<<">>>>>>>"<<packet.stream_index<<packet.pts<<packet.dts;

        if (av_interleaved_write_frame(outFormatCtx,&packet) < 0) continue;
        }
        av_packet_unref(&packet);
    }

    av_write_trailer(outFormatCtx);

_______________________________________________
Libav-user mailing list
[hidden email]
https://ffmpeg.org/mailman/listinfo/libav-user

To unsubscribe, visit link above, or email
[hidden email] with subject "unsubscribe".