解决方案 »

  1.   

    使用流媒体。使用ffmpeg转码。
    播放器用这个,我做过:http://flowplayer.org/tools/demos/
      

  2.   

    可以详细说一下吗? 是在action  里面做一个转化?   转码一帧 flush 一帧 然后播放一帧?
      

  3.   

    我刚刚用快播试了一下,,,在远程服务器架设了一个TOMCAT  ,APPS 下面有一个视频,直接使用快播调用远程的URL 地址,AVI ,WMV  格式都测试了,都可以支持边缓冲边播放,难道我下午用百度影音测试的时候有问题?  还是 下午测试的时候是局域网,没有外网环境,所以不能联网下载解码器?
      

  4.   

    不是播放器问题!你要把你所有的后台视频格式转换成flv格式的。现在基本上大型在线视频网站都是flv格式的。我上面说了用ffmpeg可以转成flv格式的。api或者exe都可以做到。你自己研究下,转成flv之后基本上用一个flash播放器都可以变下载变放,而且随意拖动。我直线写的一个Converter,你可以参考下package com.cemso.util;import java.io.File;
    import java.io.InputStream;
    import java.util.ArrayList;
    import java.util.List;import org.apache.commons.logging.Log;
    import org.apache.commons.logging.LogFactory;public class VideoConverter {        private final static String BASE_PATH = FileOperationTool.DEFAULT_VIDEO_DES_PATH;
            private final static String FLV_PATH = FileOperationTool.DEFAULT_FLV_PATH;
            private static String PATH = "";
            private static String FILE_NAME = "";
            
            private static final Log log = LogFactory.getLog(com.cemso.util.VideoConverter.class);        public static boolean convert(String fileName) {
                    PATH = BASE_PATH + fileName;
                    FILE_NAME = fileName;
                    if(log.isDebugEnabled()){
                            log.debug("start to convert video to flv format...");
                            log.debug("the file name is : " + FILE_NAME);
                            log.debug("the file path is : " + PATH);
                    }                if (!checkfile(PATH)) {
                            return false;
                    } else {
                            if (process()) {
                                    if(log.isDebugEnabled()){
                                            log.debug("process() ok");
                                    }
                                    return true;
                            } else {
                                    return false;
                            }
                    }
            }        private static boolean process() {
                    int type = checkContentType();
                    boolean status = false;
                    if (type == 0) {
                            if(log.isDebugEnabled()){
                                    log.debug("Start to convert to flv file");
                            }
                            status = processFLV(PATH);// 直接将文件转为flv文件
                    } else if (type == 1) {
                            String avifilepath = processAVI(type);
                            if (avifilepath == null){
                                    return false;// avi文件没有得到
                            }
                            status = processFLV(avifilepath);// 将avi转为flv
                    } else if(type == 9){
                            if(log.isDebugEnabled()){
                                    log.debug("this file is no need to convert.");
                            }
                            return false;
                    }
                    return status;
            }        private static int checkContentType() {
                    String type = PATH.substring(PATH.lastIndexOf(".") + 1, PATH.length())
                                    .toLowerCase();
                    // ffmpeg能解析的格式:(asx,asf,mpg,wmv,3gp,mp4,mov,avi,flv等)
                    if (type.equals("avi")) {
                            return 0;
                    } else if (type.equals("mpg")) {
                            return 0;
                    } else if (type.equals("wmv")) {
                            return 0;
                    } else if (type.equals("3gp")) {
                            return 0;
                    } else if (type.equals("mov")) {
                            return 0;
                    } else if (type.equals("mp4")) {
                            return 0;
                    } else if (type.equals("asf")) {
                            return 0;
                    } else if (type.equals("asx")) {
                            return 0;
                    } else if (type.equals("flv")) {
                            return 0;
                    }
                    // 对ffmpeg无法解析的文件格式(wmv9,rm,rmvb等),
                    // 可以先用别的工具(mencoder)转换为avi(ffmpeg能解析的)格式.
                    else if (type.equals("wmv9")) {
                            return 1;
                    } else if (type.equals("rm")) {
                            return 1;
                    } else if (type.equals("rmvb")) {
                            return 1;
                    }
                    return 9;
            }        // check file
            private static boolean checkfile(String path) {
                    File file = new File(path);
                    if (!file.isFile()) {
                            return false;
                    }
                    return true;
            }        // 对ffmpeg无法解析的文件格式(wmv9,rm,rmvb等), 可以先用别的工具(mencoder)转换为avi(ffmpeg能解析的)格式.
            private static String processAVI(int type) {
                    List<String> commend = new ArrayList<String>();
                    commend.add(FLV_PATH + "/mencoder");
                    commend.add(PATH);
                    commend.add("-oac");
                    commend.add("lavc");
                    commend.add("-lavcopts");
                    commend.add("acodec=mp3:abitrate=64");
                    commend.add("-ovc");
                    commend.add("xvid");
                    commend.add("-xvidencopts");
                    commend.add("bitrate=600");
                    commend.add("-of");
                    commend.add("avi");
                    commend.add("-o");
                    commend.add(FLV_PATH + FILE_NAME.substring(0,FILE_NAME.lastIndexOf(".")) + ".avi");
                    try {
                            ProcessBuilder builder = new ProcessBuilder();
                            builder.command(commend);
                            builder.start();
                            return FLV_PATH + FILE_NAME.substring(0,FILE_NAME.lastIndexOf(".")) + ".avi";
                    } catch (Exception e) {
                            e.printStackTrace();
                            return null;
                    }
            }        // ffmpeg能解析的格式:(asx,asf,mpg,wmv,3gp,mp4,mov,avi,flv等)
            private static boolean processFLV(String oldfilepath) {                if (!checkfile(PATH)) {
                            return false;
                    }                List<String> commend = new ArrayList<String>();
                    commend.add(FLV_PATH + "ffmpeg");
                    commend.add("-i");
                    commend.add(oldfilepath);
                    commend.add("-ab");
                    commend.add("56");
                    commend.add("-ar");
                    commend.add("22050");
                    commend.add("-qscale");
                    commend.add("8");
                    commend.add("-r");
                    commend.add("15");
                    commend.add("-s");
                    commend.add("600x500");
                    commend.add(FLV_PATH + FILE_NAME.substring(0,FILE_NAME.lastIndexOf(".")) + ".flv");                try {
                            Runtime runtime = Runtime.getRuntime();
                            String cmd = "";
                            String cut = FLV_PATH + "ffmpeg.exe -i "
                                            + oldfilepath
                                            + " -y -f image2 -ss 8 -t 0.001 -s 600x500 "
                                            + FLV_PATH
                                            + FILE_NAME.substring(0,FILE_NAME.lastIndexOf("."))
                                            + ".jpg";
                            String cutCmd = cmd + cut;
                            runtime.exec(cutCmd);
                            ProcessBuilder builder = new ProcessBuilder(commend);
                            builder.command(commend);
                            Process process = builder.start();
                            int i = doWaitFor(process);
                            if(i == 0){
                                    if(log.isDebugEnabled()){
                                            log.debug("ffmpeg has finished.");
                                    }
                            }                        return true;
                    } catch (Exception e) {
                            e.printStackTrace();
                            return false;
                    }
            }
            
            public static int doWaitFor(Process p) {
             int exitValue = -1; // returned to caller when p is finished
             try {         InputStream in = p.getInputStream();
             InputStream err = p.getErrorStream();
             boolean finished = false; // Set to true when p is finished         while(!finished){
             try {
             while( in.available() > 0) {
             // Print the output of our system call
             Character c = new Character( (char) in.read());
             if(log.isDebugEnabled()){
                     log.debug( c);
             }
             }
             while( err.available() > 0) {
             // Print the output of our system call
             Character c = new Character( (char) err.read());
             if(log.isDebugEnabled()){
                     log.debug( c);
             }
             }         // Ask the process for its exitValue. If the process
             // is not finished, an IllegalThreadStateException
             // is thrown. If it is finished, we fall through and
             // the variable finished is set to true.
             exitValue = p.exitValue();
             finished = true;
             }
             catch (IllegalThreadStateException e) {
             Thread.currentThread();
                                            // Process is not finished yet;
             // Sleep a little to save on CPU cycles
             Thread.sleep(500);
             }
             }
             }
             catch (Exception e) {
             // unexpected exception! print it out for debugging...
                     if(log.isErrorEnabled()){
                             log.error("doWaitFor(): unexpected exception - " +
             e.getMessage());
                     }
             if(log.isErrorEnabled()){
                     log.error(e.getMessage());
             }
             }
             // return completion status to caller
             return exitValue;
            }
    }
      

  5.   

    我经过测试使用QVOD  可以直接调用URL 来完成视频的播放工作,但是现在的环境是内网,每次调用的时候都会提示一个 QVOD的错误,什么内如不能为read ,然后在使用JS 来设置一次QvodPlayer.URL可以解决问题是 现在页面会有广告,http://buffer-ad.qvod.com/pi4.html 这个地址 (内网,页面404)我已经设置<PARAM NAME='QvodAdUrl' VALUE=''>   难道这样不行?
      

  6.   

    那你测试了其他格式的视频了吗?QVOD也要解码的,有的解不了也放不了。告诉你解决方案是用流媒体。所有格式搞定
      

  7.   


    主流格式 都测试通过了。没什么问题,然后 缓冲和暂停的广告 我更改了hosts 文件屏蔽了。还有一个问题,,就是我 每次点击 播放列表  更换其他的 URL 播放的时候 会多跳出一个快播的图标(右下角的任务栏)这样的话 我点击10个URL 那就产生了10个快播的图标在任务栏里,鼠标滑过去,就只剩下一个了,感觉应该是没有正常调用的问题。我写了一个JS 更改URL    function changeUrl(url){
       QvodPlayer.URL =  encodeURI(url); 
    }这段代码就产生了上面说的那个问题。不知道 我应该怎么样去做?  还有从网上找了一下  只有支持网页调用的,不用安装客户端的,解码器太少,无法播放很多格式。我现在的目的就是 只在网页上面播就行,不希望再安装一个快播程序,也不要快播里面的捆绑插件,不知道大家有没有什么好的办法提供?谢谢!
      

  8.   

    你架一个 red5 服务器得了,或者别的 RTMP 服务器
      

  9.   

    由于出差所以结贴晚了,现在是用的是qvod 的网页插件实现的视频播,这样就避免了avi 等格式的流操作问题
      

  10.   

    我很想弄明白,为什么需要转码。从文件格式与编码格式,rtmp协议上分析,是什么限制了对AVI的直接支持。
    类似快播这样的,是什么原理呢,DIVX也称能直接播放AVI,是怎么回事呢?
      

  11.   

    斑竹V5,我现在使用的办法就是你说的这样的。但现在有一个问题,从AVI转码到FLV需要一定的时间,每次导入新的AVI后,要等待一段时间才能播放。有没有更快更及时播放的方法呢?
      

  12.   

    斑竹V5,我现在使用的办法就是你说的这样的。但现在有一个问题,从AVI转码到FLV需要一定的时间,每次导入新的AVI后,要等待一段时间才能播放。有没有更快更及时播放的方法呢?
      

  13.   

    FileOperationTool  这个类怎么没有啊 
      

  14.   

    牛人 大神 能回答么   能提供FileOperationTool 这个类么 ?