如果只需要推送单独的视频流或者音频流时,最简单的方式是用python启动一个ffmpeg命令行进程,然后往该进程写入视频或者音频原始数据即可。
推送视频流代码
command = ['ffmpeg',
'-y', '-an',
'-f', 'rawvideo',
'-vcodec','rawvideo',
'-pix_fmt', 'rgb24', #像素格式
'-s', "{}x{}".format(width, height),
'-r', str(fps),
'-i', '-',
'-pix_fmt', 'yuv420p',
'-vcodec', "h264",
'-f' , 'flv',
push_url]
pipe = subprocess.Popen(command, shell=False, stdin=subprocess.PIPE)
在需要写入视频帧时调用
pipe.stdin.write(image.tostring())
推送音频流代码
command = ['ffmpeg',
'-y', '-vn',
'-f', 's16le',
'-acodec','pcm_s16le',
'-ac', '1',
'-ar', '16000',
'-i', '-',
'-acodec', 'aac',
'-f' , 'flv',
push_url]
pipe = subprocess.Popen(command, shell=False, stdin=subprocess.PIPE)
在需要写入音频时调用
pipe.stdin.write(frame.tostring())
在同时有音视频时,用ffmpeg命令行一直没有调试成功,最后只好用c++代码调用ffmpeg api实现,然后再封装成python函数。这里主要参考了ffmpeg源代码中examples/muxing.c,对于音视频时间戳的同步需要比较注意,在这篇文章中有详细介绍 https://zhuanlan.zhihu.com/p/675007477。 代码已经开源 https://github.com/lipku/python_rtmpstream