Я могу хорошо передавать потоковое видео, используя 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;
}