在 FFmpeg/Libav 中监听端口
Listening to port in FFmpeg/Libav
在FFmpeg中,为了监听指定的端口,有一个参数"-listen":
# Server side (receiving):
ffmpeg -listen 1 -enter code herei http://server:port -c copy somefile.ogg
https://www.ffmpeg.org/ffmpeg-protocols.html#toc-http
我想在带有 Libav 的 C++ 中使用此命令(因为 FFMpeg 已移至 Libav)。
要监听一个端口,我需要使用哪种Libav方法?
我通过以下方式解决了这个问题:
void listen(const unsigned int port) {
const int TIMEOUT = 600000;
// check if webservice is already listening
if (!m_listening) {
m_listening = true;
// Format specification: tcp://hostname:port[?options]
// See: https://www.ffmpeg.org/ffmpeg-protocols.html#tcp
std::stringstream ss;
ss << "tcp://localhost:" << port << "?listen=1" << "?listen_timeout=" << TIMEOUT << "?timeout=" << TIMEOUT * 1000;
const std::string publishingPointURI = ss.str();
avformat_network_init();
if (avformat_open_input(&m_stream, publishingPointURI.c_str(), NULL, NULL) != 0) {
throw Exception(
"Unable to buffer stream received from " + publishingPointURI + "");
}
m_listening = false;
}
在FFmpeg中,为了监听指定的端口,有一个参数"-listen":
# Server side (receiving):
ffmpeg -listen 1 -enter code herei http://server:port -c copy somefile.ogg
https://www.ffmpeg.org/ffmpeg-protocols.html#toc-http
我想在带有 Libav 的 C++ 中使用此命令(因为 FFMpeg 已移至 Libav)。
要监听一个端口,我需要使用哪种Libav方法?
我通过以下方式解决了这个问题:
void listen(const unsigned int port) {
const int TIMEOUT = 600000;
// check if webservice is already listening
if (!m_listening) {
m_listening = true;
// Format specification: tcp://hostname:port[?options]
// See: https://www.ffmpeg.org/ffmpeg-protocols.html#tcp
std::stringstream ss;
ss << "tcp://localhost:" << port << "?listen=1" << "?listen_timeout=" << TIMEOUT << "?timeout=" << TIMEOUT * 1000;
const std::string publishingPointURI = ss.str();
avformat_network_init();
if (avformat_open_input(&m_stream, publishingPointURI.c_str(), NULL, NULL) != 0) {
throw Exception(
"Unable to buffer stream received from " + publishingPointURI + "");
}
m_listening = false;
}