RTSP туннелируемый HTTP, FFMPEG

Я пытаюсь выполнить потоковую передачу с IP-камеры Axis, которая использует RTSP через HTTP. Я могу заставить работать обычный поток RTSP, но не могу найти никакой информации или документации о том, как на самом деле установить режим туннелирования для потока. Он поддерживается в исходном коде, если для параметра control_transport установлено значение RTSP_MODE_TUNNEL. Мой вопрос прост, как мне это сделать со следующим кодом?

 int ret = avformat_open_input(&pFormatCtx, [@"rtsp://ip/axis-media/media.amp" UTF8String], NULL, NULL);

Я пробовал следующее:

pFormatCtx = avformat_alloc_context();
pFormatCtx->priv_data = malloc(sizeof(RTSPState));
RTSPState *rt = pFormatCtx->priv_data;
rt->control_transport = RTSP_MODE_TUNNEL;
int ret = avformat_open_input(&pFormatCtx, [@"rtsp://ip/axis-media/media.amp" UTF8String], NULL, NULL);

Но он просто игнорирует это для меня (он по-прежнему использует RTP). это я тоже пробовал

 int ret = avformat_open_input(&pFormatCtx, [@"rtsp://ip/axis-media/media.amp" UTF8String], NULL, NULL);
RTSPState *rt = pFormatCtx->priv_data;
rt->control_transport = RTSP_MODE_TUNNEL;

Как бы я решил это? Я думаю, что это что-то действительно простое, так как есть ENUM.

Рабочее решение

AVDictionary *opts = 0;
int ret = av_dict_set(&opts, "rtsp_transport", "http", 0);


ret = avformat_open_input(&pFormatCtx, [@"rtsp://ip:80/axis-media/media.amp" UTF8String], NULL, &opts);

av_dict_free(&opts);

person Jon Andersen    schedule 22.01.2013    source источник


Ответы (1)


ты пробовал это

AVDictionary *opts = 0;
    if (usesTcp) {
        int ret = av_dict_set(&opts, "rtsp_transport", "tcp", 0);
    }


    err = avformat_open_input(&avfContext, filename, NULL, &opts);
    av_dict_free(&opts);
person Michelle Cannon    schedule 22.01.2013
comment
Спасибо! Работает как шарм. Ваш stackoverflow и блог компании предоставили много полезной информации при рассмотрении этой проблемы. - person Jon Andersen; 23.01.2013
comment
@ Мишель Кэннон: как вы устанавливаете флаг useTcp? Можно ли как-то узнать, идет ли поток RTSP через tcp, http или udp? - person Tushar Koul; 07.11.2013
comment
мы устанавливаем его вручную, потому что обычно знаем, чего хотим. основная проблема заключается в том, что после открытия входного потока он полностью находится в руках ffmpeg. Таким образом, у вас есть некоторые варианты, но их очень мало. (1) создать собственный обработчик ввода-вывода для ffmpeg . (2) изменить ffmpeg с помощью ловушки после попытки подключения. или что-то, с чем у нас был хороший успех, используйте туннель, чтобы получить поток, прежде чем передать его игроку. Для этого мы использовали локальную реализацию прокси 555. Таким образом, мы можем делать все, что захотим, прежде чем передать это нашему проигрывателю streamMorePlay. - person Michelle Cannon; 07.11.2013
comment
мы всегда любим помогать разработчикам, поэтому не стесняйтесь заключать с нами контракт. - person Michelle Cannon; 07.11.2013
comment
Кстати, похоже, что набор параметров avformat_open_input задокументирован на ffmpeg.org/ffmpeg-protocols. .html#rtsp. Для rtsp_transport похоже, что он принимает udp, tcp, http и udp_multicast. Также есть опция preference_tcp для rtsp_flags, которая сначала пробует TCP, а затем UDP, если он не может подключиться, я думаю. Я подтвердил, что значения rtsp_transport работают по крайней мере в libav 11.7 (кстати, также тестировалось с камерой Axis). - person Jason C; 09.10.2016