這篇文章介紹了兩種方法用于從Wowza Transcoder 插件獲得視頻截圖。要讓這功能正常工作,Wowza Transcoder 必須處于正常運行狀態(tài)并正在對一個視頻流進行轉(zhuǎn)碼。
注意: 這個功能要求Wowza Media Server® 3.0.0及更高版本。

一、HTTP Provider
你可以用一個已經(jīng)內(nèi)建的,位于管理端口8086上的HTTP接口來從正在運行中的Wowza transcoder獲得一個位圖。Http URL格式如下:
http://[wowza-ip-address]:8086/transcoderthumbnail?application=[application-name]&streamname=[stream-name]&format=[jpegor png]&size=[widthxheight]
其中:
要使用這個HTTP服務(wù),請用文本編輯器打開[install-dir]/conf/VHost.xml文件,將com.wowza.wms.transcoder.httpprovider.HTTPTranscoderThumbnail 中的 AuthenticationMethod 設(shè)置為: none。這樣將關(guān)閉基于用戶名和密碼的認證。
接下來, 對Wowza Server進行配置,以對一個輸入流進行轉(zhuǎn)碼。
在下面的例子中, 假定我們要轉(zhuǎn)碼的流為myStream,應(yīng)用名為live. 要獲得這個實時流的當前截圖,請在WEB瀏覽器上訪問以下URL:
http://[wowza-ip-address]:8086/transcoderthumbnail?application=live&streamname=myStream&format=jpeg&size=320x240
注意: 這個URL是區(qū)分大小寫的。
日志
每一次請求截圖時,你都會在[install-dir]/logs/wowzamediaserver_access.log中看到一個log消息:
commentserver INFO 200 - HTTPTranscoderThumbnail#GrabResult.onGrabFrame[live/_definst_/myStream]:Image result: format:jpeg size:320x240 timecode:107633
二、服務(wù)端 API
下面是一段代碼例子,建立了莪一個名為grabFrame([stream-name])的方法,可供遠程調(diào)用,獲得實時流的當前截圖:
package com.wowza.wms.plugin.test.module;
import java.awt.image.*;
import javax.imageio.*;
import java.io.*;
import com.wowza.wms.amf.*;
import com.wowza.wms.client.*;
import com.wowza.wms.request.*;
import com.wowza.wms.module.*;
import com.wowza.wms.application.*;
import com.wowza.wms.stream.*;
import com.wowza.wms.transcoder.model.*;
import com.wowza.wms.transcoder.util.*;
public class ModuleTestTranscoderFrameGrabextends ModuleBase
{
privateIApplicationInstance appInstance = null;
classGrabResult implements ITranscoderFrameGrabResult
{
publicvoid onGrabFrame(TranscoderNativeVideoFrame videoFrame)
{
BufferedImageimage = TranscoderStreamUtils.nativeImageToBufferedImage(videoFrame);
if(image != null)
{
getLogger().info("ModuleTestTranscoderFrameGrab#GrabResult.onGrabFrame:"+image.getWidth()+"x"+image.getHeight());
StringstorageDir = appInstance.getStreamStoragePath();
FilepngFile = new File(storageDir+"/thumbnail.png");
FilejpgFile = new File(storageDir+"/thumbnail.jpg");
try
{
if (pngFile.exists())
pngFile.delete();
ImageIO.write(image,"png", pngFile);
getLogger().info("ModuleTestTranscoderFrameGrab#GrabResult.onGrabFrame:Save image: "+pngFile);
}
catch(Exceptione)
{
getLogger().error("ModuleTestTranscoderFrameGrab.grabFrame:File write error: "+pngFile);
}
try
{
if(jpgFile.exists())
jpgFile.delete();
ImageIO.write(image,"jpg", jpgFile);
getLogger().info("ModuleTestTranscoderFrameGrab#GrabResult.onGrabFrame:Save image: "+jpgFile);
}
catch(Exceptione)
{
getLogger().error("ModuleTestTranscoderFrameGrab.grabFrame:File write error: "+jpgFile);
}
}
}
}
publicvoid onAppStart(IApplicationInstance appInstance)
{
getLogger().info("ModuleTestTranscoderFrameGrab.onAppStart["+appInstance.getContextStr()+"]");
this.appInstance= appInstance;
}
publicvoid grabFrame(IClient client, RequestFunction function, AMFDataList params)
{
getLogger().info("ModuleTestTranscoderFrameGrab.grabFrame");
while(true)
{
StringstreamName = params.getString(PARAM1);
if(streamName == null)
{
getLogger().warn("ModuleTestTranscoderFrameGrab.grabFrame:No streamName");
break;
}
IApplicationInstanceappInstance = client.getAppInstance();
if(appInstance == null)
{
getLogger().warn("ModuleTestTranscoderFrameGrab.grabFrame:No appInstance");
break;
}
IMediaStreamstream = appInstance.getStreams().getStream(streamName);
if(stream == null)
{
getLogger().warn("ModuleTestTranscoderFrameGrab.grabFrame:No stream");
break;
}
LiveStreamTranscoderliveStreamTranscoder =(LiveStreamTranscoder)stream.getLiveStreamTranscoder("transcoder");
if(liveStreamTranscoder == null)
{
getLogger().warn("ModuleTestTranscoderFrameGrab.grabFrame:No liveStreamTranscoder");
break;
}
TranscoderStreamtranscodingStream = liveStreamTranscoder.getTranscodingStream();
if(transcodingStream == null)
{
getLogger().warn("ModuleTestTranscoderFrameGrab.grabFrame:No transcodingStream");
break;
}
TranscoderStreamSourceVideosourceVideo = transcodingStream.getSource().getVideo();
if(sourceVideo == null)
{
getLogger().warn("ModuleTestTranscoderFrameGrab.grabFrame:No sourceVideo");
break;
}
getLogger().info("ModuleTestTranscoderFrameGrab.grabFrame:Call grabFrame");
sourceVideo.grabFrame(newGrabResult(), 426, 240);
break;
}
}
}
要在Flash應(yīng)用中調(diào)用這個方法, 先用RTMP連接到Wowza Media Server,然后用下面的方式調(diào)用:
nc.call(grabFrame, null,"[stream-name]");
其中 [stream-name] 就是你要獲得截圖的實時流的名字.
Wowza Streaming Engine 4是業(yè)界功能強大、API接口豐富的流媒體Server產(chǎn)品,采用它作為流媒體服務(wù)器產(chǎn)品的案例很多,直播、在線教育、IPTV都有它的用武之地。
京ICP備09015132號-996 | 違法和不良信息舉報電話:4006561155
© Copyright 2000-2026 北京哲想軟件有限公司版權(quán)所有 | 地址:北京市海淀區(qū)西三環(huán)北路50號豪柏大廈C2座11層1105室
北京哲想軟件集團旗下網(wǎng)站:哲想軟件 | 哲想動畫