正在显示
3 个修改的文件
包含
106 行增加
和
12 行删除
| @@ -126,7 +126,7 @@ Supported operating systems and hardware: | @@ -126,7 +126,7 @@ Supported operating systems and hardware: | ||
| 126 | 16. support live stream transcoding by ffmpeg.<br/> | 126 | 16. support live stream transcoding by ffmpeg.<br/> |
| 127 | 17. support live stream transcoding by ffmpeg.<br/> | 127 | 17. support live stream transcoding by ffmpeg.<br/> |
| 128 | 18. support ffmpeg filters(logo/overlay/crop), x264 params.<br/> | 128 | 18. support ffmpeg filters(logo/overlay/crop), x264 params.<br/> |
| 129 | -19. [dev] support audio transcode only, speex/mp3 to aac<br/> | 129 | +19. support audio transcode only, speex/mp3 to aac<br/> |
| 130 | 20. [plan] support network based cli and json result.<br/> | 130 | 20. [plan] support network based cli and json result.<br/> |
| 131 | 21. [plan] support http callback api hooks(for authentication).<br/> | 131 | 21. [plan] support http callback api hooks(for authentication).<br/> |
| 132 | 22. [plan] support bandwidth test api and flash client.<br/> | 132 | 22. [plan] support bandwidth test api and flash client.<br/> |
| @@ -15,6 +15,7 @@ log_dir ./objs/logs; | @@ -15,6 +15,7 @@ log_dir ./objs/logs; | ||
| 15 | # default: 2000 | 15 | # default: 2000 |
| 16 | max_connections 2000; | 16 | max_connections 2000; |
| 17 | # vhost list, the __defaultVhost__ is the default vhost | 17 | # vhost list, the __defaultVhost__ is the default vhost |
| 18 | +# for example, user use ip to access the stream: rtmp://192.168.1.2/live/livestream. | ||
| 18 | # for which cannot identify the required vhost. | 19 | # for which cannot identify the required vhost. |
| 19 | # for default demo. | 20 | # for default demo. |
| 20 | vhost __defaultVhost__ { | 21 | vhost __defaultVhost__ { |
| @@ -44,7 +45,7 @@ vhost __defaultVhost__ { | @@ -44,7 +45,7 @@ vhost __defaultVhost__ { | ||
| 44 | vparams { | 45 | vparams { |
| 45 | } | 46 | } |
| 46 | acodec libaacplus; | 47 | acodec libaacplus; |
| 47 | - abitrate 30; | 48 | + abitrate 45; |
| 48 | asample_rate 44100; | 49 | asample_rate 44100; |
| 49 | achannels 2; | 50 | achannels 2; |
| 50 | aparams { | 51 | aparams { |
| @@ -90,7 +91,7 @@ vhost dev { | @@ -90,7 +91,7 @@ vhost dev { | ||
| 90 | enabled on; | 91 | enabled on; |
| 91 | ffmpeg ./objs/ffmpeg/bin/ffmpeg; | 92 | ffmpeg ./objs/ffmpeg/bin/ffmpeg; |
| 92 | engine dev { | 93 | engine dev { |
| 93 | - enabled on; | 94 | + enabled off; |
| 94 | vfilter { | 95 | vfilter { |
| 95 | } | 96 | } |
| 96 | vcodec libx264; | 97 | vcodec libx264; |
| @@ -104,7 +105,18 @@ vhost dev { | @@ -104,7 +105,18 @@ vhost dev { | ||
| 104 | vparams { | 105 | vparams { |
| 105 | } | 106 | } |
| 106 | acodec libaacplus; | 107 | acodec libaacplus; |
| 107 | - abitrate 30; | 108 | + abitrate 45; |
| 109 | + asample_rate 44100; | ||
| 110 | + achannels 2; | ||
| 111 | + aparams { | ||
| 112 | + } | ||
| 113 | + output rtmp://127.0.0.1:[port]/[app]?vhost=[vhost]/[stream]_[engine]; | ||
| 114 | + } | ||
| 115 | + engine dev_acodec { | ||
| 116 | + enabled on; | ||
| 117 | + vcodec copy; | ||
| 118 | + acodec libaacplus; | ||
| 119 | + abitrate 45; | ||
| 108 | asample_rate 44100; | 120 | asample_rate 44100; |
| 109 | achannels 2; | 121 | achannels 2; |
| 110 | aparams { | 122 | aparams { |
| @@ -134,7 +146,7 @@ vhost mirror.transcode.vhost.com { | @@ -134,7 +146,7 @@ vhost mirror.transcode.vhost.com { | ||
| 134 | vparams { | 146 | vparams { |
| 135 | } | 147 | } |
| 136 | acodec libaacplus; | 148 | acodec libaacplus; |
| 137 | - abitrate 30; | 149 | + abitrate 45; |
| 138 | asample_rate 44100; | 150 | asample_rate 44100; |
| 139 | achannels 2; | 151 | achannels 2; |
| 140 | aparams { | 152 | aparams { |
| @@ -164,7 +176,7 @@ vhost drawtext.transcode.vhost.com { | @@ -164,7 +176,7 @@ vhost drawtext.transcode.vhost.com { | ||
| 164 | vparams { | 176 | vparams { |
| 165 | } | 177 | } |
| 166 | acodec libaacplus; | 178 | acodec libaacplus; |
| 167 | - abitrate 30; | 179 | + abitrate 45; |
| 168 | asample_rate 44100; | 180 | asample_rate 44100; |
| 169 | achannels 2; | 181 | achannels 2; |
| 170 | aparams { | 182 | aparams { |
| @@ -194,7 +206,7 @@ vhost crop.transcode.vhost.com { | @@ -194,7 +206,7 @@ vhost crop.transcode.vhost.com { | ||
| 194 | vparams { | 206 | vparams { |
| 195 | } | 207 | } |
| 196 | acodec libaacplus; | 208 | acodec libaacplus; |
| 197 | - abitrate 30; | 209 | + abitrate 45; |
| 198 | asample_rate 44100; | 210 | asample_rate 44100; |
| 199 | achannels 2; | 211 | achannels 2; |
| 200 | aparams { | 212 | aparams { |
| @@ -224,7 +236,27 @@ vhost logo.transcode.vhost.com { | @@ -224,7 +236,27 @@ vhost logo.transcode.vhost.com { | ||
| 224 | vparams { | 236 | vparams { |
| 225 | } | 237 | } |
| 226 | acodec libaacplus; | 238 | acodec libaacplus; |
| 227 | - abitrate 30; | 239 | + abitrate 45; |
| 240 | + asample_rate 44100; | ||
| 241 | + achannels 2; | ||
| 242 | + aparams { | ||
| 243 | + } | ||
| 244 | + output rtmp://127.0.0.1:[port]/[app]?vhost=[vhost]/[stream]_[engine]; | ||
| 245 | + } | ||
| 246 | + } | ||
| 247 | +} | ||
| 248 | +# audio transcode only. | ||
| 249 | +# for example, FMLE publish audio codec in mp3, and donot support HLS output, | ||
| 250 | +# we can transcode the audio to aac and copy video to the new stream with HLS. | ||
| 251 | +vhost audio.transcode.vhost.com { | ||
| 252 | + transcode { | ||
| 253 | + enabled on; | ||
| 254 | + ffmpeg ./objs/ffmpeg/bin/ffmpeg; | ||
| 255 | + engine acodec { | ||
| 256 | + enabled on; | ||
| 257 | + vcodec copy; | ||
| 258 | + acodec libaacplus; | ||
| 259 | + abitrate 45; | ||
| 228 | asample_rate 44100; | 260 | asample_rate 44100; |
| 229 | achannels 2; | 261 | achannels 2; |
| 230 | aparams { | 262 | aparams { |
| @@ -233,6 +265,20 @@ vhost logo.transcode.vhost.com { | @@ -233,6 +265,20 @@ vhost logo.transcode.vhost.com { | ||
| 233 | } | 265 | } |
| 234 | } | 266 | } |
| 235 | } | 267 | } |
| 268 | +# ffmpeg-copy(forward implements by ffmpeg). | ||
| 269 | +# copy the video and audio to a new stream. | ||
| 270 | +vhost copy.transcode.vhost.com { | ||
| 271 | + transcode { | ||
| 272 | + enabled on; | ||
| 273 | + ffmpeg ./objs/ffmpeg/bin/ffmpeg; | ||
| 274 | + engine copy { | ||
| 275 | + enabled on; | ||
| 276 | + vcodec copy; | ||
| 277 | + acodec copy; | ||
| 278 | + output rtmp://127.0.0.1:[port]/[app]?vhost=[vhost]/[stream]_[engine]; | ||
| 279 | + } | ||
| 280 | + } | ||
| 281 | +} | ||
| 236 | # transcode all app and stream of vhost | 282 | # transcode all app and stream of vhost |
| 237 | vhost all.transcode.vhost.com { | 283 | vhost all.transcode.vhost.com { |
| 238 | # the streaming transcode configs. | 284 | # the streaming transcode configs. |
| @@ -258,7 +304,9 @@ vhost all.transcode.vhost.com { | @@ -258,7 +304,9 @@ vhost all.transcode.vhost.com { | ||
| 258 | # for filters, @see: http://ffmpeg.org/ffmpeg-filters.html | 304 | # for filters, @see: http://ffmpeg.org/ffmpeg-filters.html |
| 259 | filter_complex 'overlay=10:10'; | 305 | filter_complex 'overlay=10:10'; |
| 260 | } | 306 | } |
| 261 | - # video encoder name | 307 | + # video encoder name. can be: |
| 308 | + # libx264: use h.264(libx264) video encoder. | ||
| 309 | + # copy: donot encoder the video stream, copy it. | ||
| 262 | vcodec libx264; | 310 | vcodec libx264; |
| 263 | # video bitrate, in kbps | 311 | # video bitrate, in kbps |
| 264 | vbitrate 1500; | 312 | vbitrate 1500; |
| @@ -287,7 +335,9 @@ vhost all.transcode.vhost.com { | @@ -287,7 +335,9 @@ vhost all.transcode.vhost.com { | ||
| 287 | bf 3; | 335 | bf 3; |
| 288 | refs 10; | 336 | refs 10; |
| 289 | } | 337 | } |
| 290 | - # audio encoder name | 338 | + # audio encoder name. can be: |
| 339 | + # libaacplus: use aac(libaacplus) audio encoder. | ||
| 340 | + # copy: donot encoder the audio stream, copy it. | ||
| 291 | acodec libaacplus; | 341 | acodec libaacplus; |
| 292 | # audio bitrate, in kbps. [16, 72] for libaacplus. | 342 | # audio bitrate, in kbps. [16, 72] for libaacplus. |
| 293 | abitrate 70; | 343 | abitrate 70; |
| @@ -362,13 +412,45 @@ vhost all.transcode.vhost.com { | @@ -362,13 +412,45 @@ vhost all.transcode.vhost.com { | ||
| 362 | vparams { | 412 | vparams { |
| 363 | } | 413 | } |
| 364 | acodec libaacplus; | 414 | acodec libaacplus; |
| 365 | - abitrate 30; | 415 | + abitrate 45; |
| 416 | + asample_rate 44100; | ||
| 417 | + achannels 2; | ||
| 418 | + aparams { | ||
| 419 | + } | ||
| 420 | + output rtmp://127.0.0.1:[port]/[app]?vhost=[vhost]/[stream]_[engine]; | ||
| 421 | + } | ||
| 422 | + engine vcopy { | ||
| 423 | + enabled on; | ||
| 424 | + vcodec copy; | ||
| 425 | + acodec libaacplus; | ||
| 426 | + abitrate 45; | ||
| 366 | asample_rate 44100; | 427 | asample_rate 44100; |
| 367 | achannels 2; | 428 | achannels 2; |
| 368 | aparams { | 429 | aparams { |
| 369 | } | 430 | } |
| 370 | output rtmp://127.0.0.1:[port]/[app]?vhost=[vhost]/[stream]_[engine]; | 431 | output rtmp://127.0.0.1:[port]/[app]?vhost=[vhost]/[stream]_[engine]; |
| 371 | } | 432 | } |
| 433 | + engine acopy { | ||
| 434 | + enabled on; | ||
| 435 | + vcodec libx264; | ||
| 436 | + vbitrate 300; | ||
| 437 | + vfps 20; | ||
| 438 | + vwidth 768; | ||
| 439 | + vheight 320; | ||
| 440 | + vthreads 2; | ||
| 441 | + vprofile baseline; | ||
| 442 | + vpreset superfast; | ||
| 443 | + vparams { | ||
| 444 | + } | ||
| 445 | + acodec copy; | ||
| 446 | + output rtmp://127.0.0.1:[port]/[app]?vhost=[vhost]/[stream]_[engine]; | ||
| 447 | + } | ||
| 448 | + engine copy { | ||
| 449 | + enabled on; | ||
| 450 | + vcodec copy; | ||
| 451 | + acodec copy; | ||
| 452 | + output rtmp://127.0.0.1:[port]/[app]?vhost=[vhost]/[stream]_[engine]; | ||
| 453 | + } | ||
| 372 | } | 454 | } |
| 373 | } | 455 | } |
| 374 | # transcode all stream using the empty ffmpeg demo, donothing. | 456 | # transcode all stream using the empty ffmpeg demo, donothing. |
| @@ -389,7 +471,7 @@ vhost ffempty.transcode.vhost.com { | @@ -389,7 +471,7 @@ vhost ffempty.transcode.vhost.com { | ||
| 389 | vparams { | 471 | vparams { |
| 390 | } | 472 | } |
| 391 | acodec libaacplus; | 473 | acodec libaacplus; |
| 392 | - abitrate 30; | 474 | + abitrate 45; |
| 393 | asample_rate 44100; | 475 | asample_rate 44100; |
| 394 | achannels 2; | 476 | achannels 2; |
| 395 | aparams { | 477 | aparams { |
| @@ -42,6 +42,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | @@ -42,6 +42,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | ||
| 42 | 42 | ||
| 43 | #define SRS_ENCODER_SLEEP_MS 2000 | 43 | #define SRS_ENCODER_SLEEP_MS 2000 |
| 44 | 44 | ||
| 45 | +#define SRS_ENCODER_COPY "copy" | ||
| 45 | #define SRS_ENCODER_VCODEC "libx264" | 46 | #define SRS_ENCODER_VCODEC "libx264" |
| 46 | #define SRS_ENCODER_ACODEC "libaacplus" | 47 | #define SRS_ENCODER_ACODEC "libaacplus" |
| 47 | 48 | ||
| @@ -138,6 +139,7 @@ int SrsFFMPEG::initialize(SrsRequest* req, SrsConfDirective* engine) | @@ -138,6 +139,7 @@ int SrsFFMPEG::initialize(SrsRequest* req, SrsConfDirective* engine) | ||
| 138 | } | 139 | } |
| 139 | _transcoded_url.push_back(output); | 140 | _transcoded_url.push_back(output); |
| 140 | 141 | ||
| 142 | + if (vcodec != SRS_ENCODER_COPY) { | ||
| 141 | if (vcodec != SRS_ENCODER_VCODEC) { | 143 | if (vcodec != SRS_ENCODER_VCODEC) { |
| 142 | ret = ERROR_ENCODER_VCODEC; | 144 | ret = ERROR_ENCODER_VCODEC; |
| 143 | srs_error("invalid vcodec, must be %s, actual %s, ret=%d", | 145 | srs_error("invalid vcodec, must be %s, actual %s, ret=%d", |
| @@ -179,6 +181,9 @@ int SrsFFMPEG::initialize(SrsRequest* req, SrsConfDirective* engine) | @@ -179,6 +181,9 @@ int SrsFFMPEG::initialize(SrsRequest* req, SrsConfDirective* engine) | ||
| 179 | srs_error("invalid vpreset: %s, ret=%d", vpreset.c_str(), ret); | 181 | srs_error("invalid vpreset: %s, ret=%d", vpreset.c_str(), ret); |
| 180 | return ret; | 182 | return ret; |
| 181 | } | 183 | } |
| 184 | + } | ||
| 185 | + | ||
| 186 | + if (acodec != SRS_ENCODER_COPY) { | ||
| 182 | if (acodec != SRS_ENCODER_ACODEC) { | 187 | if (acodec != SRS_ENCODER_ACODEC) { |
| 183 | ret = ERROR_ENCODER_ACODEC; | 188 | ret = ERROR_ENCODER_ACODEC; |
| 184 | srs_error("invalid acodec, must be %s, actual %s, ret=%d", | 189 | srs_error("invalid acodec, must be %s, actual %s, ret=%d", |
| @@ -203,6 +208,7 @@ int SrsFFMPEG::initialize(SrsRequest* req, SrsConfDirective* engine) | @@ -203,6 +208,7 @@ int SrsFFMPEG::initialize(SrsRequest* req, SrsConfDirective* engine) | ||
| 203 | achannels, ret); | 208 | achannels, ret); |
| 204 | return ret; | 209 | return ret; |
| 205 | } | 210 | } |
| 211 | + } | ||
| 206 | if (output.empty()) { | 212 | if (output.empty()) { |
| 207 | ret = ERROR_ENCODER_OUTPUT; | 213 | ret = ERROR_ENCODER_OUTPUT; |
| 208 | srs_error("invalid empty output, ret=%d", ret); | 214 | srs_error("invalid empty output, ret=%d", ret); |
| @@ -252,6 +258,8 @@ int SrsFFMPEG::start() | @@ -252,6 +258,8 @@ int SrsFFMPEG::start() | ||
| 252 | params.push_back("-vcodec"); | 258 | params.push_back("-vcodec"); |
| 253 | params.push_back(vcodec); | 259 | params.push_back(vcodec); |
| 254 | 260 | ||
| 261 | + // the codec params is disabled when copy | ||
| 262 | + if (vcodec != SRS_ENCODER_COPY) { | ||
| 255 | params.push_back("-b:v"); | 263 | params.push_back("-b:v"); |
| 256 | snprintf(tmp, sizeof(tmp), "%d", vbitrate * 1000); | 264 | snprintf(tmp, sizeof(tmp), "%d", vbitrate * 1000); |
| 257 | params.push_back(tmp); | 265 | params.push_back(tmp); |
| @@ -289,11 +297,14 @@ int SrsFFMPEG::start() | @@ -289,11 +297,14 @@ int SrsFFMPEG::start() | ||
| 289 | } | 297 | } |
| 290 | } | 298 | } |
| 291 | } | 299 | } |
| 300 | + } | ||
| 292 | 301 | ||
| 293 | // audio specified. | 302 | // audio specified. |
| 294 | params.push_back("-acodec"); | 303 | params.push_back("-acodec"); |
| 295 | params.push_back(acodec); | 304 | params.push_back(acodec); |
| 296 | 305 | ||
| 306 | + // the codec params is disabled when copy | ||
| 307 | + if (acodec != SRS_ENCODER_COPY) { | ||
| 297 | params.push_back("-b:a"); | 308 | params.push_back("-b:a"); |
| 298 | snprintf(tmp, sizeof(tmp), "%d", abitrate * 1000); | 309 | snprintf(tmp, sizeof(tmp), "%d", abitrate * 1000); |
| 299 | params.push_back(tmp); | 310 | params.push_back(tmp); |
| @@ -316,6 +327,7 @@ int SrsFFMPEG::start() | @@ -316,6 +327,7 @@ int SrsFFMPEG::start() | ||
| 316 | } | 327 | } |
| 317 | } | 328 | } |
| 318 | } | 329 | } |
| 330 | + } | ||
| 319 | 331 | ||
| 320 | // output | 332 | // output |
| 321 | params.push_back("-f"); | 333 | params.push_back("-f"); |
-
请 注册 或 登录 后发表评论