<div dir="ltr">Hi, Im trying to make a RTSP server, but I dont know how could I set the url from my server or when.<div><br></div><div>By the moment I have:</div><div><br></div><div><div>#include "SenderRtsp.h"</div><div>#include <sys/time.h></div><div><br></div><div>namespace payloader {</div><div><br></div><div>DEFINE_LOGGER(SenderRtsp, "SenderRtsp");</div><div><br></div><div>SenderRtsp::SenderRtsp(const std::string& url) : input_url_(url)  {</div><div>     ELOG_DEBUG("Creating source reader to %s", input_url_.c_str());</div><div>    // url = url.c_str();</div><div>    //outContext = NULL;</div><div>}</div><div><br></div><div>SenderRtsp::~SenderRtsp() {</div><div>    // deliver_thread_.join();</div><div>  //  avformat_close_input(&av_context_);</div><div><br></div><div>}</div><div><br></div><div><br></div><div>int SenderRtsp::init(){</div><div><br></div><div>    printf("starting sender...\n");</div><div><br></div><div>    //const char *url = "rtsp://rtsp://<a href="http://138.4.13.92:8554/ej">138.4.13.92:8554/ej</a>";</div><div>   // url = "rtsp://<a href="http://test:password@192.168.33.19:1935/ffmpeg/0">test:password@192.168.33.19:1935/ffmpeg/0</a>";</div><div>   </div><div><br></div><div>    av_log_set_level(AV_LOG_DEBUG);</div><div>    av_log_set_level(AV_LOG_TRACE);</div><div><br></div><div>    av_register_all();</div><div>    avformat_network_init();</div><div><br></div><div>    static const char* output_formats[] = { NULL, "mp3", "ogg", "avi", "rtsp" };</div><div><br></div><div><br></div><div>    ret = avformat_alloc_output_context2(&outContext, NULL , output_formats[4], input_url_.c_str()); //Asignamos contexto de SALIDA</div><div>    if (ret < 0) {</div><div>        av_log(NULL, AV_LOG_FATAL, "Could not allocate an output context for '%s'.\n",  input_url_.c_str());</div><div>        </div><div>    }else{</div><div>         ELOG_DEBUG("Allocated an output context for %s .\n", input_url_.c_str());</div><div>       //  goto end;</div><div>    }</div><div><br></div><div><br></div><div>    </div><div><br></div><div>    av_dump_format(outContext, 0, input_url_.c_str(), 1);</div><div><br></div><div>    if (!outContext->oformat) {</div><div>        av_log(NULL, AV_LOG_FATAL, "Could not create the output format for '%s'.\n",  input_url_.c_str());</div><div>       </div><div>    }else{</div><div>         ELOG_DEBUG("Created an output context.\n");</div><div>       // goto end;</div><div>    }</div><div><br></div><div>        // open output file to write to it.</div><div>    // ret = avio_open2(&outContext->pb, url, AVIO_FLAG_WRITE, NULL, NULL);</div><div>    // if (ret < 0) {</div><div>    //     av_log(NULL, AV_LOG_FATAL, "Could not open output file to write to it.\n");</div><div>    </div><div>    // }else{</div><div>    //      ELOG_DEBUG("Allocated an output context.\n");</div><div>    // }</div><div><br></div><div>    </div><div><br></div><div> //   av_dump_format(outContext, 0, url, 1);</div><div>    ELOG_DEBUG("Conecting to RTSP server for '%s'.\n", input_url_.c_str());</div><div>    ret = avformat_write_header(outContext, NULL);</div><div>    if (ret != 0) {</div><div>        av_log(NULL, AV_LOG_ERROR, "Failed to connect to RTSP server for %s.\n",input_url_.c_str());</div><div>        //goto end;</div><div>    }else{</div><div>         ELOG_DEBUG("Conected to RTSP server for '%s'.\n", input_url_.c_str());</div><div>    }</div><div><br></div><div>  //  sendFrame(outContext,video_st);</div><div><br></div><div>    return 1;</div><div>}</div><div>void SenderRtsp::receiveRtpPacket(unsigned char* inBuff, int buffSize){</div><div>return;</div><div>}</div><div><br></div><div><br></div><div>void SenderRtsp::sendPacket(AVPacket& pkt){</div><div><br></div><div>    printf("Press any key to start streaming...\n");</div><div>    getchar();</div><div><br></div><div>   // ELOG_DEBUG("Trying to send packet of %d bytes", pkt.size);</div><div><br></div><div>    auto startSend = std::chrono::system_clock::now();</div><div><br></div><div>    while (pkt.size != NULL ) {</div><div>        frameCount++;</div><div>        auto startFrame = std::chrono::system_clock::now();</div><div><br></div><div><br></div><div>        pkt.stream_index = 0;</div><div>        ret = av_write_frame(outContext, &pkt);// Manda el frame</div><div>         if (ret < 0) {</div><div>                av_log(NULL, AV_LOG_ERROR, "Error while writing video frame.\n");</div><div>         }</div><div><br></div><div>        auto streamDuration = std::chrono::duration_cast<chrono::milliseconds>(std::chrono::system_clock::now() - startSend).count();</div><div><br></div><div>       // printf("Elapsed time %ldms, video stream pts %ld.\n", streamDuration, video_st->pts.val);</div><div><br></div><div>        if (streamDuration / 1000.0 > STREAM_DURATION) {</div><div>            break;</div><div>        }</div><div>        else {</div><div>            auto frameDuration = std::chrono::duration_cast<chrono::milliseconds>(std::chrono::system_clock::now() - startFrame).count();</div><div>            std::this_thread::sleep_for(std::chrono::milliseconds((long)(1000.0 / STREAM_FRAME_RATE - frameDuration)));</div><div>        }</div><div>    }</div><div><br></div><div>    // if (video_st) {</div><div>    //     avcodec_close(video_st->codec);</div><div>    //     av_free(src_picture.data[0]);</div><div>    //     av_free(dst_picture.data[0]);</div><div>    //     av_frame_free(&frame);</div><div>    // }</div><div><br></div><div>    avformat_free_context(outContext);</div><div><br></div><div>end:</div><div>    printf("finished.\n");</div><div><br></div><div>    getchar();</div><div>}</div><div><br></div><div><br></div><div>}   // Namespace payloader</div><div><br></div></div></div>