用node和ffmpeg进行直播推流

2015-12-27  ouyang789...

国庆月经心血来潮,写了个在vps上运行的推流直播的小玩意,要知道阿里云2M带宽上行网速是很快的,推流能达到1500K(至少比寝室100K封顶强多了),24h放片高清流畅无压力。 

之前有人用树莓派这样玩过,其实都离不开ffmpeg。ffmpeg的开发团队非常活跃,网络直播大热就马上开发了rtmp等各种协议的推流功能,在这里我用到了node的fluent-ffmpeg,它其实只是将ffmpeg的api进行了封装。

AIM

在阿里云ubuntu系统下运行24h推流程序,向战旗TV推流(只搞到战旗主播账号,不过都是rtmp协议,没差~)

TOOLS

  • ffmpeg
  • fluent-ffmpeg(封装ffmpeg的api的node模块)
  • 阿里云(2M 1G内存 20G硬盘 ubuntu)

DEMO CODE

  1. var ffmpeg = require('fluent-ffmpeg');
  2. var inputPath = './media/mv.mp4';
  3. var outputPath = 'rtmp://dlrtmpup.cdn.zhanqi.tv/zqlive/*********';
  4. ffmpeg(inputPath)
  5. .inputOptions('-re')
  6. .inputOptions('-ac 2')
  7. .addInput('./bin/logo.png')
  8. .complexFilter([
  9. {
  10. filter: 'scale',
  11. options: [1080,-1],
  12. inputs: '[0:v]',
  13. outputs: 'c'
  14. },
  15. {
  16. filter: 'scale',
  17. options: [200,-1],
  18. inputs: '[1:v]',
  19. outputs: 'logo'
  20. },
  21. {
  22. filter: 'overlay',
  23. options: {
  24. x: 'main_w-overlay_w-5',
  25. y: 5
  26. },
  27. inputs: ['c','logo'],
  28. outputs: ['output','a']
  29. }
  30. ],'output')
  31. .on('start', function(commandLine) {
  32. console.log('Spawned Ffmpeg with command: ' + commandLine);
  33. })
  34. .on('error', function(err, stdout, stderr) {
  35. console.log('error: ' + err.message);
  36. console.log('stdout: ' + stdout);
  37. console.log('stderr: ' + stderr);
  38. })
  39. .on('end', function() {
  40. console.log('Processing finished !');
  41. })
  42. .addOptions([
  43. '-vcodec libx264',
  44. '-preset veryfast',
  45. '-crf 22',
  46. '-maxrate 1000k',
  47. '-bufsize 3000k',
  48. '-acodec libmp3lame',
  49. '-ac 2',
  50. '-ar 44100',
  51. '-b:a 96k'
  52. ])
  53. .format('flv')
  54. .pipe(outputPath, { end: true });

TIPS

  • 如果使用fluent-ffmpeg这个包需要进行一下源码修改,否则会提示输出路径错误,具体原因就是源码里有一段是对输出流进行是否是writeableStraem的判断(我们的输出流当然是可写的啦),最简单的方法就是把报错的那段注释掉 = =!

  • 上图中rtmp地址+直播码即输出路径,可以理解为WriteableStream
  • 输入配置-re:以原视频帧率输入
  • complexFilter:复杂滤镜,适用于多输入输出,用它实现了加logo和对输出进行尺寸调整
  • 只有用flv格式输出才能向rtmp推流
  • -preset veryfast:牺牲视频质量,换取流畅性(否则以1G的内存难以流畅编码,会导致直播卡顿)
  • -ar 44100:音频采样率
  • -ac 2:双声道输出
  • 既然是24h推流,只放一个片儿当然是对不起观众,在试过各种方法后我选择了concat这个fliter来进行自如的视频衔接。用法可以去看ffmpeg的官方文档或者搜索。
  • 担心程序崩掉的话可以加上日志实时输出的功能,崩掉自动重启,读取上次的timemark,再次起飞~

END

效果如上??

在程序运行时间内,阿里云cpu使用率一直100%,有于我们选择veryfast的预设,实时转码时视频质量已经做出很大让步,但仍然使cpu处于高负载之下,当然这和ffmpeg处理的原视频文件也有关系。

推流网速600k以上,所以说短板在于cpu而不在于网速。 

唯一没解决的问题是,在手机上(ios8)用战旗app看时,选择硬件解码会没有声音


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。如发现有害或侵权内容,请点击这里 或 拨打24小时举报电话:4000070609 与我们联系。

    猜你喜欢

    0条评论

    发表

    请遵守用户 评论公约

    类似文章
    喜欢该文的人也喜欢 更多