2015-12-10 39 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