FFmpeg - RTCP BYE пакеты - PullRequest
       90

FFmpeg - RTCP BYE пакеты

0 голосов
/ 20 октября 2019

Я работаю над проектом C ++, который зависит от электронной платы Wi-Fi RAK5206. Я использую библиотеку ffmpeg для получения видео- и аудиопотока, и у меня есть проблема, при которой я могу запустить и остановить поток четыре раза, но когда я хочу запустить в пятый раз, я получаю ошибку. Описание ошибки Invalid data found when processing input, и это происходит, когда я вызываю функцию avformat_open_input, и мне нужно перезапустить электронную плату, повторно подключиться к Wi-Fi и т. Д.

Я выяснил с помощью приложения Wireshark, что VLC работает, и этоотправляет несколько пакетов BYE при вызове TEARDOWN. Интересно, зависит ли ошибка от них, потому что из моего заявления я не отправляю. Как я могу выполнить настройку, чтобы заставить ffmpeg отправлять пакеты BYE?

В файле rtpenc.h я нашел несколько объявлений, какие опции устанавливать и пробовать, когда я хочу подключиться, но, очевидно, безуспешно,Код, который я использовал для настройки параметров и открытия ввода:

AVDictionary* stream_opts = 0;
av_dict_set(&stream_opts, "rtpflags", "send_bye", 0);
avformat_open_input(&format_ctx, url.c_str(), NULL, &stream_opts);

Ответы [ 2 ]

0 голосов
/ 29 октября 2019

Устранена проблема с добавлением флага 16 (двоичный: 10000) к AVFormatContext флагу объекта.

formatCtx->flags = formatCtx->flags | 16;

Согласно rtpenc.h :

#define FF_RTP_FLAG_SEND_BYE  16
0 голосов
/ 20 октября 2019

Убедитесь, что вы вызываете эту функцию av_write_trailer из своего приложения.

, если нет, отладьте и проверьте ее.

/* Write the trailer, if any. The trailer must be written before you
     * close the CodecContexts open when you wrote the header; otherwise
     * av_write_trailer() may try to use memory that was freed on
     * av_codec_close(). */
    av_write_trailer(oc);

функция Вызовите фрагмент кода потока из источника ffmpeg:

    av_write_trailer -> 
    ....
    ret = s->oformat->write_trailer(s);
    } else {
        s->oformat->write_trailer(s);
    }
    ...
    .write_trailer  = rtp_write_trailer  -> 
    ...
    if (s1->pb && (s->flags & FF_RTP_FLAG_SEND_BYE))
       rtcp_send_sr(s1, ff_ntp_time(), 1)
...