我正在使用node-media-server
npm模块来托管我的rtmp服务器。我从服务器捕获了视频数据包,我注意到用ffmpeg -f gdigrab -offset_x 1920 -framerate 60 -video_size hd1080 -i desktop -crf 0 -preset ultrafast -f flv rtmp://localhost
流式传输的视频数据包开始于
2200 0085
或2200 0084
和1200 0085
,和1200 0084
开头。当我使用OBS流式传输到我的rtmp服务器时,我会捕获以...开头的视频数据包
2701 0000 0000 00
和1701 0000 0000
开头。我想要做的是我捕获这些数据包,存储它,并在连接到我的服务器时将这些数据包发送给“玩家”。我使用ffmpeg
捕获的数据包和使用flv
转换为ffmpeg
格式的视频。
但是,播放器不播放使用OBS流式传输的视频数据包。但是,当我的rtmp服务器只是“中继”接收的内容而不是“重放”捕获的数据包时,播放器确实能够很好地发挥作用。但音频播放效果很好。
我想知道那些起始十六进制代表什么(是否表明OBS没有使用flv
文件格式)。
(1)
“...当我使用OBS流式传输到我的RTMP服务器时,我会捕获以...开头的视频数据包
27 01 00 00 00 00 00
和- 第一个数据包以
17 01 00 00 00 00
开头我想知道那些起始十六进制代表什么(它是否表明OBS没有使用FLV文件格式)。“
这些字节值对于FLV格式是正确的(参见:"Video encoding" section under FLV Structure。
假设数据包以字节XY 01 00 00
开头......
X == 1
用于关键帧(I帧),X == 2
用于支持P / B帧。Y == 7
用于编解码器H.264(MPEG)。你会注意到在FFmpeg生成的FLV中,Y
编解码器类型是2
。默认情况下,FFmpeg使用Sorenson Spark编解码器(具有低图像质量)输出FLV。
要让FFmpeg在FLV中输出H264,请使用-c:v libx264
,例如:
ffmpeg -f gdigrab -offset_x 1920 -framerate 60 -video_size hd1080 -i desktop -c:v libx264 -crf 0 -preset ultrafast -f flv rtmp://localhost
(2)
“然而,玩家不会播放与OBS一起流式传输的视频数据包。”
我认为OBS意味着Open Broadcaster Software?有没有办法提供一个简短的样本输出FLV文件进行分析?或者尝试捕获流处理发送的每个字节(按照出现的顺序)。如果我是播放器/解码器,那么我从RTMP链接收到的前100个字节是多少?
你能确定发送给玩家的FLV数据包含正确的数据,例如:
进入播放器/解码器......
然后应该跟(个别框架)......
09...
直到27 01 00 00... etc
)。基本上确保FLV数据正常工作。玩家对音频编解码器的看法是什么?
您的音频也是以MP3格式发送的吗?这是我可以想象你的“音频播放得很好”的唯一方法,因为MP3帧每个都有自己的标题,这些数据可能会被发送到播放器的字节中识别出来(例如:播放器忽略未知字节但是理解MP3部分,因此解码为发言者)。使用ADTS标头发送的AAC音频也可能有效,但ADTS标头不应该位于媒体容器内(不是FLV,MP4或AVI)。
(3)我建议你为你的操作系统下载一个十六进制编辑器(如果使用Windows,请尝试HxD)。
比较来自FFmpeg和OBS的两个FLV文件的字节。寻找像...这样的典型结构 (这是FLV标头和元数据):
46 4C 56 01 01 00 00 00 09 00 00 00 00 12 00 01 FLV.............
25 00 00 00 00 00 00 00 02 00 0A 6F 6E 4D 65 74 %..........onMet
61 44 61 74 61 08 00 00 00 0C 00 08 64 75 72 61 aData.......dura
74 69 6F 6E 00 40 46 D9 99 99 99 99 9A 00 05 77 tion.@FÙ™™™™š..w
69 64 74 68 00 40 77 00 00 00 00 00 00 00 06 68 [email protected]
65 69 67 68 74 00 40 75 00 00 00 00 00 00 00 0D eight.@u........
76 69 64 65 6F 64 61 74 61 72 61 74 65 00 40 8A videodatarate.@Š
0B F6 00 00 00 00 00 09 66 72 61 6D 65 72 61 74 .ö......framerat
65 00 40 48 1A 20 84 C4 02 3E 00 0C 76 69 64 65 e.@H. „Ä.>..vide
6F 63 6F 64 65 63 69 64 00 40 1C 00 00 00 00 00 ocodecid.@......
然后音频/视频帧被打包成AV标签(数据开始09
如果视频,08
如果音频):
09 XX XX XX XX XX XX 00 00 00 00
后跟帧数据27 01 00 00 XX 00 00 XX XX XX XX etc