FFmpeg, для работы, может использовать две реализации RTMP: свою встроенную, которая активна по умолчанию, и при помощи librtmp. Последняя должна принудительно включаться опцией
--enable-librtmp.
Все встроенные механизмы FFmpeg могут использовать пользовательский
interrupt колбек. Установить его можно для формата используя поле
AVFormatContext::interrupt_callback.
Встроенная реализация RTMP его обрабатывает (как минимум, я чинил в 2014 году утечку файловых дескрипторов в
rtmp_open() на подключении при срабатывании этого колбека), а реализация при помощи
librtmp - нет, просто потому, что вся кухня происходит внутри librtmp (из всех колбеков, которые можно ей задать - колбек для логирования).
Проверить, с какой реализацией rtmp собран FFmpeg, можно запустив его без параметров и поискать строку
--enable-librtmp:
Код:
$ ffmpeg
ffmpeg version 3.0 Copyright (c) 2000-2016 the FFmpeg developers
built with gcc 4.8 (Ubuntu 4.8.4-2ubuntu1~14.04.1)
configuration: --prefix=/usr --libdir=/usr/lib/ --incdir=/usr/include/ffmpeg3.0 --datadir=/usr/share/ffmpeg3.0 --docdir=/usr/share/doc/ffmpeg3.0 --enable-shared --enable-avresample --disable-stripping --enable-gpl --enable-version3 --enable-nonfree --enable-runtime-cpudetect --build-suffix=.ffmpeg3.0 --progs-suffix=3.0 --enable-postproc --enable-x11grab --enable-avisynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnutls --enable-ladspa --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libdc1394 --enable-libfaac --enable-libfdk_aac --enable-libflite --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libmodplug --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopus --enable-libpulse --enable-librtmp --enable-libschroedinger --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-openal --enable-opengl --enable-pthreads --enable-vaapi --enable-vdpau --enable-zlib --enable-debug=3
По поводу разницы, я особо не могу сказать: внутренняя более фичаста и функциональна, развивается, но испытывает больше проблем при publishing потока: librtmp поддерживает более навороченные схемы URL, которые особо любит Wowza. librtmp же находится в состоянии стагнации, развития нет, очень часто случаются такие проблемы с тайм-аутами (нет возможности поставить колбек на чтение). В своём PPA я планирую отказаться от сборки с librtmp в пользу встроенной поддержки.
Кроме того, внутренняя реализация поддерживает listen, чего категорически нет в librtmp. Т.е. можно тестировать схемы, где ffmpeg будет выступать в роли эдакого стримингового сервера.
И да
stimeout пробывал?