2015-12-10 36 views
2

看来,这一定会发生在许多不同的情况下,如添加字幕。我想要做的是抓住一个框架,改变其中的一些功能,然后“放回去”,以便最终用户看到这一变化。我想我知道如何抓取和修改框架,但重新插入到流中,我不知道该怎么做。希望链接或代码。Wowza:在播放流时修改流?

回答

2

在实时流上,根据最终目标可能会有几件事要考虑。如果它是真正的数据包/帧级别操作,则可能需要进行修改并将输出设置为新流(源保持未受损,但新流具有修改)。在线修改流将会产生问题。

使用IMediaStreamLivePacketNotify

包级的修改可以实现IMediaStreamLivePacketNotify接口来处理新的数据包,并根据需要进行修改。示例实现:

private class PacketListener implements IMediaStreamLivePacketNotify 
{ 

    @Override 
    public void onLivePacket(IMediaStream stream, AMFPacket packet) 
    { 
     // handle packet modifications 
    } 
} 

修改数据包后,您可以将它发布到通过发布服务器对象发布的辅助流。

Publisher.createInstance(vhost, appName, appInstName); 

出版商包含的功能,以A/V数据添加到您的新的数据流:

switch (packet.getType()) 
    { 
    case IVHost.CONTENTTYPE_AUDIO: 
     publisher.addAudioData(packet.getData(), packet.getAbsTimecode()); 
     break; 

    case IVHost.CONTENTTYPE_VIDEO: 
     publisher.addVideoData(packet.getData(), packet.getAbsTimecode()); 
     break; 
    case IVHost.CONTENTTYPE_DATA: 
    case IVHost.CONTENTTYPE_DATA3: 
     publisher.addDataData(packet.getData(), packet.getAbsTimecode()); 
    } 

还有就是Duplicate Streams module在此实现更广泛的外观之内类似的功能。使用getPlayPackets(

数据包级别的修改)

你也可以看看IMediaStream对象,并充分利用IMediaStream.getPlayPackets()功能。然后,您可以获取数据包并根据需要修改相应的线程,以持续处理入站流。之后,您可以使用Publisher对象发布新流(类似于上面)。

元数据注入

不过,如果你只是希望inject some metadata过程变得更为基本。您可以修改源流中的AMFDataList以包含新的元信息。

添加到流

如果您正在寻找将数据添加到在线流(VS修改它),你可以简单地通过ImediaStream对象添加:

IMediaStream.addAudioData(..) 
+0

不Wowza处理Live与VOD的方式如此不同,以至于其中的代码对其他代码不起作用?我无法获得Wowza提供的示例工作,我不知道如果使用mp4文件而不是像摄像头那样的“实时”源(?)导致问题。 – Jeff

+0

对于VOD,您无法获取播放数据包。你可能可以做到这一点,VOD请求将通过媒体阅读器修改源,检查出[链接](https://www.wowza.com/forums/content.php?作为其使用的示例,如何选择音频数据和/或视频频道 - 来自多声道MP4文件的使用IMediaReaderActionNotify)。 – Matt