From 06278176ddfeb215c134d9cf475ffb5ce1ffa8e5 Mon Sep 17 00:00:00 2001 From: winlin Date: Sat, 30 Nov 2013 21:53:28 +0800 Subject: [PATCH] add research empty ffmpeg --- trunk/conf/srs.conf | 2 +- trunk/src/core/srs_core_encoder.cpp | 65 +++++++++++++++++++++++++++++ trunk/src/core/srs_core_encoder.hpp | 2 + trunk/src/core/srs_core_error.hpp | 1 + 4 files changed, 69 insertions(+), 1 deletion(-) diff --git a/trunk/conf/srs.conf b/trunk/conf/srs.conf index c41214fa9..0dd699ecb 100755 --- a/trunk/conf/srs.conf +++ b/trunk/conf/srs.conf @@ -18,7 +18,7 @@ vhost __defaultVhost__ { #forward 127.0.0.1:1936; transcode { enabled on; - ffmpeg ./objs/ffmpeg/bin/ffmpeg; + ffmpeg /home/winlin/srs/objs/ffmpeg/bin/ffmpeg; engine fd{ enabled on; vcodec libx264; diff --git a/trunk/src/core/srs_core_encoder.cpp b/trunk/src/core/srs_core_encoder.cpp index ce7fde6cb..8ae1fdde5 100644 --- a/trunk/src/core/srs_core_encoder.cpp +++ b/trunk/src/core/srs_core_encoder.cpp @@ -23,6 +23,9 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include +#include +#include + #include #include #include @@ -35,6 +38,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. SrsFFMPEG::SrsFFMPEG(std::string ffmpeg_bin) { started = false; + pid = -1; ffmpeg = ffmpeg_bin; vbitrate = 0; @@ -75,6 +79,14 @@ int SrsFFMPEG::initialize(std::string vhost, std::string port, std::string app, // ensure the size is even. vwidth -= vwidth % 2; vheight -= vheight % 2; + + // input stream, from local. + input = "rtmp://127.0.0.1:"; + input += port; + input += "/"; + input += app; + input += "/"; + input += stream; if (vhost == RTMP_VHOST_DEFAULT) { output = srs_replace(output, "[vhost]", "127.0.0.1"); @@ -167,6 +179,59 @@ int SrsFFMPEG::start() return ret; } + // prepare execl params + char vsize[22]; + snprintf(vsize, sizeof(vsize), "%dx%d", vwidth, vheight); + char vaspect[22]; + snprintf(vaspect, sizeof(vaspect), "%d:%d", vwidth, vheight); + + // we use vfork, for we use fored process + // to start ffmpeg, that is, exec after vfork. + if ((pid = fork()) < 0) { + ret = ERROR_ENCODER_FORK; + srs_error("vfork process failed. ret=%d", ret); + return ret; + } + + // child process: ffmpeg encoder engine. + if (pid == 0) { + // must exec immediately, or may introduce bug. + ret = execl(ffmpeg.c_str(), + "-i", input.c_str(), + // video specified. + "-vcodec", vcodec.c_str(), + "-b:v", vbitrate * 1000, + "-r", vfps, + "-size", vsize, + "-aspect", vaspect, // TODO: add aspect if needed. + "-threads", vthreads, + "-profile", vprofile.c_str(), + "-preset", vpreset.c_str(), + vparams.c_str(), + // audio specified. + "-acodec", acodec.c_str(), + "-b:a", abitrate * 1000, + "-ar", asample_rate, + "-ac", achannels, + aparams.c_str(), + "-f", "flv", + "-y", output.c_str(), + NULL + ); + if (ret < 0) { + fprintf(stderr, "fork ffmpeg failed, errno=%d(%s)", + errno, strerror(errno)); + } + exit(ret); + } + + // parent. + if (pid > 0) { + started = true; + srs_trace("vfored ffmpeg encoder engine, pid=%d", pid); + return ret; + } + return ret; } diff --git a/trunk/src/core/srs_core_encoder.hpp b/trunk/src/core/srs_core_encoder.hpp index beda2d392..5944ed845 100644 --- a/trunk/src/core/srs_core_encoder.hpp +++ b/trunk/src/core/srs_core_encoder.hpp @@ -44,6 +44,7 @@ class SrsFFMPEG { private: bool started; + pid_t pid; private: std::string ffmpeg; std::string vcodec; @@ -61,6 +62,7 @@ private: int achannels; std::string aparams; std::string output; + std::string input; public: SrsFFMPEG(std::string ffmpeg_bin); virtual ~SrsFFMPEG(); diff --git a/trunk/src/core/srs_core_error.hpp b/trunk/src/core/srs_core_error.hpp index c027a01ff..d03b9cdc3 100644 --- a/trunk/src/core/srs_core_error.hpp +++ b/trunk/src/core/srs_core_error.hpp @@ -135,5 +135,6 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #define ERROR_ENCODER_VWIDTH 710 #define ERROR_ENCODER_VFPS 711 #define ERROR_ENCODER_VBITRATE 712 +#define ERROR_ENCODER_FORK 713 #endif \ No newline at end of file