参考
使用 GStreamer appsrc 等插件实现视频音频混流,录制和推流
http://t.zoukankan.com/luckbird-p-GStreamer_appsrc.html
目前在做的在线直播教室,需要将老师分享的屏幕和老师的声音、学生的声音录制为一个视频文件,以便学生上课后还可以再看回放。
直播服务我们采用的是腾讯的视频服务,有现成的 SDK 可以用。但 SDK 自带的录制接口满足不了我们的需求,考察了 ffmpeg 和 GStreamer 后,决定在项目中使用 GStreamer 来实现。
在开始编写代码以前,先用命令行进行测试,命令行如下:
gst-launch-1.0.exe -v --gst-debug-level=4 flvmux name=mux ! tee name=t ! queue ! filesink name=file location=test.flv
t. ! queue ! rtmpsink location=“rtmp://live.abc.com/live/…”
adder name=mix ! queue ! audiorate ! audioconvert ! voaacenc ! mux.audio
videotestsrc name=screen_src ! queue ! videorate ! x264enc ! mux.video
audiotestsrc name=send_audio_src ! queue ! audiorate ! mix.
audiotestsrc wave=5 name=receive_audio_src ! queue ! audiorate ! mix.
命令看起来有点复杂,但其实逻辑挺简单的,看下面这个逻辑图就比较容易理解了(点击查看大图)
上面的命令中的推流地址需要替换为你的推流地址,如果没有,可以先把下面这部分内容去掉不推流
t. ! queue ! rtmpsink location=“rtmp://live.abc.com/live/…”
另外这个命令是在 Windows 中的 MINGW64 的 bash 环境里面运行的, 如果在 Windows 的 cmd 环境中运行,把每行最后的 和换行去掉就可以了。
上面命令中用到了几个关键的插件,分别解释一下:
adder: 音频混流,将两路音频混为一路
voaacenc:音频编码,将原始的音频流编码为 aac 格式
x264enc:视频编码,将原始的视频流编码为 h264 格式
flvmux:flv 组装,将视频和音频组装在一起
tee:分流器,将一路输入变为两路输出,以分别进行后续的处理。一路保存为文件,一路进行推流
filesink:文件存储,将输入数据存储到指定的文件中
rtmpsink:推流,将输入数据推流到指定的视频服务器