Viber最近获得了“即时视频消息”选项,也称为“视频按键通话”(vptt)。
目录“.vptt”中的viber数据内部存在扩展名为vptt的文件。信封格式是经典的ZIP文件,提取时会提供jpg-thumbnail和“video”文件。
视频文件在第一行内显示“#!rtpplay1.0”,因此它应该是rtp-tools的格式,也由wireshark使用,并且以某种方式与实际的WebRTC趋势相关...
因此,如果此rtpdump文件中的视频内容未加密(?),“如何保存viber即时消息按键通话视频”归结为:“如何将rtpdump视频转换为mp4”。
rtpplay可以将它发送到某个端口,但ffmpeg / ffplay / vlc需要正确的sdp文件。
有人对此有所了解吗?
答案 0 :(得分:2)
rtpdump文件可以使用class TreeWidget(QTreeWidget):
customMimeType = "application/x-customTreeWidgetdata"
def mimeTypes(self):
mimetypes = QTreeWidget.mimeTypes(self)
mimetypes.append(TreeWidget.customMimeType)
return mimetypes
def startDrag(self, supportedActions):
drag = QDrag(self)
mimedata = self.model().mimeData(self.selectedIndexes())
encoded = QByteArray()
stream = QDataStream(encoded, QIODevice.WriteOnly)
self.encodeData(self.selectedItems(), stream)
mimedata.setData(TreeWidget.customMimeType, encoded)
drag.setMimeData(mimedata)
drag.exec_(supportedActions)
def dropEvent(self, event):
if event.source() == self:
event.setDropAction(Qt.MoveAction)
QTreeWidget.dropEvent(self, event)
elif isinstance(event.source(), QTreeWidget):
if event.mimeData().hasFormat(TreeWidget.customMimeType):
encoded = event.mimeData().data(TreeWidget.customMimeType)
parent = self.itemAt(event.pos())
items = self.decodeData(encoded, event.source())
for it in items:
item = QTreeWidgetItem(parent)
self.fillItem(it, item)
self.fillItems(it, item)
event.acceptProposedAction()
def fillItem(self, inItem, outItem):
for col in range(inItem.columnCount()):
for key in range(Qt.UserRole):
role = Qt.ItemDataRole(key)
outItem.setData(col, role, inItem.data(col, role))
def fillItems(self, itFrom, itTo):
for ix in range(itFrom.childCount()):
it = QTreeWidgetItem(itTo)
ch = itFrom.child(ix)
self.fillItem(ch, it)
self.fillItems(ch, it)
def encodeData(self, items, stream):
stream.writeInt32(len(items))
for item in items:
p = item
rows = []
while p is not None:
rows.append(self.indexFromItem(p).row())
p = p.parent()
stream.writeInt32(len(rows))
for row in reversed(rows):
stream.writeInt32(row)
return stream
def decodeData(self, encoded, tree):
items = []
rows = []
stream = QDataStream(encoded, QIODevice.ReadOnly)
while not stream.atEnd():
nItems = stream.readInt32()
for i in range(nItems):
path = stream.readInt32()
row = []
for j in range(path):
row.append(stream.readInt32())
rows.append(row)
for row in rows:
it = tree.topLevelItem(row[0])
for ix in row[1:]:
it = it.child(ix)
items.append(it)
return items
和rtpplay
转换为mp4。
例如,让我们考虑这些文件:
分析他们:
FFmpeg
分析结果:
$ rtpdump -Fascii -f narwhals-audio.rtpdump | head -n 1
0.000000 RTP len=15 from=0.0.0.0:0 v=2 p=0 x=0 cc=0 m=1 pt=97 (????,0,0) seq=1679 ts=249986024 ssrc=0xf944ac63
$ rtpdump -Fascii -f narwhals-audio.rtpdump | tail -n 1
65.570000 RTP len=15 from=0.0.0.0:0 v=2 p=0 x=0 cc=0 m=1 pt=97 (????,0,0) seq=4959 ts=253134824 ssrc=0xf944ac63
编解码器名称可能需要一些猜测/投资/只是尝试所有这些。
让我们为视频分配端口4646,为音频分配4848并创建一些SDP文件:
Audio sample rate = (253134824 - 249986024) / (65.57 - 0) ~= 48000
Audio codec: probably opus
Audio payload type: 97
Video sample rate: 90000
Video codec : probably VP8
Video payload type: 96
然后让我们准备一个命令行来启动FFmpeg,它将根据SDP保存到MP4文件来监听这些端口:
v=0
c=IN IP4 127.0.0.1
m=video 4646 RTP/AVP 96
a=rtpmap:96 VP8/90000
m=audio 4848 RTP/AVP 97
a=rtpmap:97 opus/48000
FFmpeg在10秒未能收到任何数据包后退出,所以不要再启动该命令行。
然后,在另一个控制台选项卡中,准备rtpplay命令行:
ffmpeg -v warning -protocol_whitelist file,udp,rtp -f sdp -i narwhals.sdp -copyts -c copy -y narwhals.mkv
也不要启动它。请注意,应该同时启动两个rtpplay -T -f narwhals-video.rtpdump 127.0.0.1/4646 & rtpplay -T -f narwhals-audio.rtpdump 127.0.0.1/4848
。
现在,快速连续,启动准备好的FFmpeg命令行,然后启动rtpplay
。等到rtpplays结束(大约一分钟)。然后FFmpeg应该超时并且你的文件已经完成。
mkv文件可能会转换为MP4,但由于MP4不支持VP8,因此需要转码。转码也可以用FFmpeg完成。
不幸的是,音频/视频同步可能是一个问题,也可以使用FFmpeg技巧解决;或者通过调整SDP中的采样率,如rtpplay
。
答案 1 :(得分:1)
它与适用于Ubuntu的Viber一起使用:
我没有和别人尝试过