Encoding 使用x264和ffmpegs swscale从位图帧流式传输视频

Encoding 使用x264和ffmpegs swscale从位图帧流式传输视频,encoding,bitmap,ffmpeg,stream,h.264,Encoding,Bitmap,Ffmpeg,Stream,H.264,目标是从位图帧创建视频流 当前解决方案:我正在通过tcp将原始24bpp位图数据从我的机器传输到“远程”服务器,以便将帧分发到客户端。当所有东西都在我的本地机器上运行时,这种方法效果很好 问题:一帧的大小是1440000(800*600*3)字节,我只有一个2Mbps的上行,我需要的视频是每秒25帧,分辨率为800x600 方法:经过一点研究后,我的方法是将位图帧编码到h264中,并流式传输生成的视频 当前情况:我编译了x264和ffmpeg(用于swscale,将RGB转换为YUV),并且我能

目标是从位图帧创建视频流

当前解决方案:我正在通过tcp将原始24bpp位图数据从我的机器传输到“远程”服务器,以便将帧分发到客户端。当所有东西都在我的本地机器上运行时,这种方法效果很好

问题:一帧的大小是1440000(800*600*3)字节,我只有一个2Mbps的上行,我需要的视频是每秒25帧,分辨率为800x600

方法:经过一点研究后,我的方法是将位图帧编码到h264中,并流式传输生成的视频

当前情况:我编译了x264和ffmpeg(用于swscale,将RGB转换为YUV),并且我能够用x264编码24bpp位图帧。我的测试程序中的最后一个操作是调用
x264\u encoder\u encode
。测试程序中的位图数据是为每一帧随机生成的

现在回答我的问题:

我该从这里走到哪里?TCP、UDP、RTMP?哪些数据将被传输?我是否只从
x264\u encoder\u encode
传输结果帧? 根据函数的返回值,其大小仍为约140000字节。这将导致 (25*140000=3500000)3.5 Mbps,仍然大于我可用的2Mpbs

虽然我还不知道怎么做,但我相信这项任务是可行的。例如,下面是一个用于twitch.tv(使用RTMP)等流媒体平台的示例

我当前的
x264_参数
()如下所示(仅供参考):


提前感谢。

关于传输协议(UDP、TCP、RTMP)的选择,请说明您的网络是本地网络还是网络。因为约束是不同的。目标是通过webHmmm流式传输。很抱歉,我不能给你一个好的回答。但我可以告诉您,这听起来很有挑战性,因为您将不得不处理丢失的数据包(UDP),其中一些数据包无法以正确的顺序到达(TCP),如果您不选择x265参数跳过P帧,您将不得不处理特定的延迟。我认识像www.digigram.com这样的公司,他们销售完整的视频流解决方案。当然,这对你来说太过分了,但是我认为这是一个需要几个月,或者至少几个星期的开发的项目,关于传输协议(UDP,TCP,RTMP)的选择,请精确说明你的网络是本地的还是网络的。因为约束是不同的。目标是通过webHmmm流式传输。很抱歉,我不能给你一个好的回答。但我可以告诉您,这听起来很有挑战性,因为您将不得不处理丢失的数据包(UDP),其中一些数据包无法以正确的顺序到达(TCP),如果您不选择x265参数跳过P帧,您将不得不处理特定的延迟。我认识像www.digigram.com这样的公司,他们销售完整的视频流解决方案。当然,这对你来说太过分了,但要给出一个想法,我认为这是一个需要数月或至少数周开发的项目
x264_param_default_preset(&param, "veryfast", "zerolatency");
param.i_threads = 1;
param.i_width = width;
param.i_height = height;
param.i_fps_num = fps;
param.i_fps_den = 1;
// Intra refres:
param.i_keyint_max = fps;
param.b_intra_refresh = 1;
//Rate control:
param.rc.i_rc_method = X264_RC_CRF;
param.rc.f_rf_constant = 25;
param.rc.f_rf_constant_max = 35;
//For streaming:
param.b_repeat_headers = 1;
param.b_annexb = 1;
x264_param_apply_profile(&param, "baseline");