如何将RTPDUMP视频文件转换为mp4

时间:2017-03-02 20:08:21

标签: ffmpeg video-streaming rtp viber

Viber最近获得了“即时视频消息”选项,也称为“视频按键通话”(vptt)。

目录“.vptt”中的viber数据内部存在扩展名为vptt的文件。信封格式是经典的ZIP文件,提取时会提供jpg-thumbnail和“video”文件。

视频文件在第一行内显示“#!rtpplay1.0”,因此它应该是rtp-tools的格式,也由wireshark使用,并且以某种方式与实际的WebRTC趋势相关...

因此,如果此rtpdump文件中的视频内容未加密(?),“如何保存viber即时消息按键通话视频”归结为:“如何将rtpdump视频转换为mp4”。

rtpplay可以将它发送到某个端口,但ffmpeg / ffplay / vlc需要正确的sdp文件。

有人对此有所了解吗?

2 个答案:

答案 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一起使用:

  • 打开PC的Viber
  • 播放消息
  • 在文件夹Viber->扩展名为.mp4的媒体中找到它。

我没有和别人尝试过