Как возобновить ffmpeg Streamer для отключения сети на некоторое время, но в конечном итоге восстановление - PullRequest
0 голосов
/ 30 сентября 2019

Я могу хорошо передавать потоковое видео, используя libav * ffmpeg, когда сеть исправна ,, но я не могу гарантировать, что сеть всегда будет исправна. Я надеюсь, что когда сеть плохая, даже отключите ее на некоторое время,Потоковый процесс может возобновиться и продолжить потоковое видео при восстановлении сети. Я пытался, когда я потоковое видео, я вручную отключил сеть, стример быстро остановился. Через 20 секунд я возобновил работу сети, процесс возобновил потоковую передачу через несколько секунд. Но если я отключаю сеть на пять минут или дольше, когда сеть восстанавливается, процесс блокируется. Кто-то знает, как возобновитьStreamer инстредактирует блокировку независимо от того, как долго сеть отключается, но в конечном итоге восстанавливается (не путем перезапуска программы). Не могли бы вы дать мне какое-то решение, если знаете - спасибо.

Я нашел решение в Google, но могуне могу найти что-то полезное. Так что я пришел сюда, чтобы попросить о помощи

static int encode_and_write_frame(AVCodecContext *codec_ctx, AVFormatContext *fmt_ctx, AVFrame *frame)
{
    AVPacket pkt = {0};
    av_init_packet(&pkt);
    int ret = avcodec_send_frame(codec_ctx, frame);
    if (ret < 0)
    {
        fprintf(stderr, "Error sending frame to codec context!\n");
        return ret;
    }
    ret = avcodec_receive_packet(codec_ctx, &pkt);
    //pkt.dts = pkt.pts;
    if (ret < 0)
    {
        fprintf(stderr, "Error receiving packet from codec context!\n" );
        return ret;
    }
    av_interleaved_write_frame(fmt_ctx, &pkt);
    av_packet_unref(&pkt);
    return 0;
}


void Streamer::stream_frame(const cv::Mat &image)
{
    if(can_stream()) {
        const int stride[] = {static_cast<int>(image.step[0])};
        sws_scale(scaler.ctx, &image.data, stride, 0, image.rows, picture.frame->data, picture.frame->linesize);
        picture.frame->pts += av_rescale_q(1, out_codec_ctx->time_base, out_stream->time_base);
 //picture.frame->dts = picture.frame->pts;
        encode_and_write_frame(out_codec_ctx, format_ctx, picture.frame);
    }
}


while(ok) {
        process_frame(read_frame, proc_frame);
        if(!from_camera) {
            streamer.stream_frame(proc_frame);
        } else {
            streamer.stream_frame(proc_frame, frame_time.count()*streamer.inv_stream_timebase);
        }
        ok = video_capture.read(read_frame);
        time_prev = time_stop;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...