使用ffmpeg进行视频覆盖 - 我想添加视频旋转代码并重写现有文件。我该怎么做?

时间:2013-10-22 10:42:44

标签: iphone video rotation ffmpeg

我想将纵向模式的.mov文件旋转90度,因为我使用了以下代码。 它有效,但会导致丢失视频帧 ...

我的代码是,

public void encode(File source, File target, EncodingAttributes attributes,
        EncoderProgressListener listener, Integer i) throws IllegalArgumentException,
        InputFormatException, EncoderException {        
    String formatAttribute = attributes.getFormat();

    Float offsetAttribute = attributes.getOffset();

    Float durationAttribute = attributes.getDuration();

    QualityScale qualityScale = attributes.getQualityScale();

    AudioAttributes audioAttributes = attributes.getAudioAttributes();

    VideoAttributes videoAttributes = attributes.getVideoAttributes();

    if (audioAttributes == null && videoAttributes == null) {
        throw new IllegalArgumentException(
                "Both audio and video attributes are null");
    }
    target = target.getAbsoluteFile();
    target.getParentFile().mkdirs();        
    FFMPEGExecutor ffmpeg = locator.createExecutor();
    if (offsetAttribute != null) {
        ffmpeg.addArgument("-ss");
        ffmpeg.addArgument(String.valueOf(offsetAttribute.floatValue()));
    }
    ffmpeg.addArgument("-i");
    ffmpeg.addArgument(source.getAbsolutePath());
    if (durationAttribute != null) {
        ffmpeg.addArgument("-t");
        ffmpeg.addArgument(String.valueOf(durationAttribute.floatValue()));
    }
    if (qualityScale != null) {
        ffmpeg.addArgument("-qscale:"+qualityScale.getQualityStreamSpecifier());
        ffmpeg.addArgument(String.valueOf(qualityScale.getQualityValue()));
    }
    if (videoAttributes == null) {
        ffmpeg.addArgument("-vn");
    } else {
        String codec = videoAttributes.getCodec();
        if (codec != null) {
            ffmpeg.addArgument("-vcodec");
            ffmpeg.addArgument(codec);
        }
        String tag = videoAttributes.getTag();
        if (tag != null) {
            ffmpeg.addArgument("-vtag");
            ffmpeg.addArgument(tag);
        }
        Integer bitRate = videoAttributes.getBitRate();
        if (bitRate != null) {
            ffmpeg.addArgument("-b");
            ffmpeg.addArgument(String.valueOf(bitRate.intValue()));
        }
        Integer frameRate = videoAttributes.getFrameRate();
        if (frameRate != null) {
            ffmpeg.addArgument("-r");
            ffmpeg.addArgument(String.valueOf(frameRate.intValue()));
        }
        VideoSize size = videoAttributes.getSize();
        if (size != null) {
            ffmpeg.addArgument("-s");
            ffmpeg.addArgument(String.valueOf(size.getWidth()) + "x"
                    + String.valueOf(size.getHeight()));
        }
        FilterGraph filterGraph = videoAttributes.getFilterGraph();
        if (filterGraph != null) {
            ffmpeg.addArgument("-vf");
            if(videoAttributes.getRotate() != null && videoAttributes.getRotate() == 90){                   
                ffmpeg.addArgument("transpose=1");
            }else if(videoAttributes.getRotate() != null && videoAttributes.getRotate() == 180){
                ffmpeg.addArgument("vflip,hflip");
            }               
            else {
                if (filterGraph.isUseExpression()) {
                    ffmpeg.addArgument(filterGraph.getFilterGraphExpression());
                }
            }           

        }

    }
    if (audioAttributes == null) {
        ffmpeg.addArgument("-an");
    } else {
        String codec = audioAttributes.getCodec();
        if (codec != null) {
            ffmpeg.addArgument("-acodec");
            ffmpeg.addArgument(codec);
        }
        Integer bitRate = audioAttributes.getBitRate();
        if (bitRate != null) {
            ffmpeg.addArgument("-ab");
            ffmpeg.addArgument(String.valueOf(bitRate.intValue()));
        }
        Integer channels = audioAttributes.getChannels();
        if (channels != null) {
            ffmpeg.addArgument("-ac");
            ffmpeg.addArgument(String.valueOf(channels.intValue()));
        }
        Integer samplingRate = audioAttributes.getSamplingRate();
        if (samplingRate != null) {
            ffmpeg.addArgument("-ar");
            ffmpeg.addArgument(String.valueOf(samplingRate.intValue()));
        }
        Integer volume = audioAttributes.getVolume();
        if (volume != null) {
            ffmpeg.addArgument("-vol");
            ffmpeg.addArgument(String.valueOf(volume.intValue()));
        }
    }
    ffmpeg.addArgument("-f");
    ffmpeg.addArgument(formatAttribute);
    ffmpeg.addArgument("-y");
    ffmpeg.addArgument(target.getAbsolutePath());       
    try {
        ffmpeg.execute();
    } catch (IOException e) {
        throw new EncoderException(e);
    }
    try {
        String lastWarning = null;
        long duration;
        long progress = 0;
        RBufferedReader reader = null;
        reader = new RBufferedReader(new InputStreamReader(ffmpeg
                .getErrorStream()));
        MultimediaInfo info = parseMultimediaInfo(source, reader);
        if (durationAttribute != null) {
            duration = (long) Math
                    .round((durationAttribute.floatValue() * 1000L));
        } else {
            duration = info.getDuration();
            if (offsetAttribute != null) {
                duration -= (long) Math
                        .round((offsetAttribute.floatValue() * 1000L));
            }
        }
        if (listener != null) {
            listener.sourceInfo(info);
        }
        int step = 0;
        String line;
        while ((line = reader.readLine()) != null) {
            System.out.println("line::::"+line);

            if (step == 0) {
                if (line.startsWith("WARNING: ")) {
                    if (listener != null) {
                        listener.message(line);
                    }
                } else if (!line.startsWith("Output #0")) {
                    //throw new EncoderException(line);
                } else {
                    step++;
                }
            } else if (step == 1) {
                if (!line.startsWith("  ")) {
                    step++;
                } else {
                    System.out.println("line>>>>>>"+line);
                    Hashtable table1 = new Hashtable();
                    Matcher m = ROTATE_INFO_PATTERN.matcher(line);
                    while (m.find()) {
                        if (table1 == null) {
                            table1 = new Hashtable();
                        }
                        String key = m.group(1);
                        String value = m.group(2);
                        table1.put(key, value);
                    }
                    System.out.println("Table values"+table1.get("rotate"));                
                    if(table1.get("rotate") != null){
                        Object videoRotateValue = table1.get("rotate");
                        int rotate = Integer.valueOf(videoRotateValue.toString());
                        switch(rotate){
                        case 90: 
                                videoAttributes.setRotate(rotate);
                                if(i == 0){
                                    i++;                                        
                                    encode(source, target, attributes, null, i);                                        
                                }

                        break;
                        case 180:                       
                            videoAttributes.setRotate(rotate);
                            if(i == 0){
                                i++;
                                encode(source, target, attributes, null, i);                                        
                            }

                    break;
                        case 270: System.out.println("case 3 :: "+videoRotateValue);
                        break;
                        }
                    }
                }
            }
            if (step == 2) {
                if (!line.startsWith("Stream mapping:")) {
                    throw new EncoderException(line);
                } else {
                    step++;
                }
            } else if (step == 3) {
                if (!line.startsWith("  ")) {
                    step++;
                }
            }
            if (step == 4) {
                line = line.trim();
                if (line.length() > 0) {
                    Hashtable table = parseProgressInfoLine(line);
                    if (table == null) {
                        if (listener != null) {
                            listener.message(line);
                        }
                        lastWarning = line;
                    } else {
                        if (listener != null) {
                            String time = (String) table.get("time");
                            if (time != null) {
                                int dot = time.indexOf('.');
                                if (dot > 0 && dot == time.length() - 2
                                        && duration > 0) {
                                    String p1 = time.substring(0, dot);
                                    String p2 = time.substring(dot + 1);
                                    try {
                                        long i1 = Long.parseLong(p1);
                                        long i2 = Long.parseLong(p2);
                                        progress = (i1 * 1000L)
                                                + (i2 * 100L);
                                        int perm = (int) Math
                                                .round((double) (progress * 1000L)
                                                        / (double) duration);
                                        if (perm > 1000) {
                                            perm = 1000;
                                        }
                                        listener.progress(perm);
                                    } catch (NumberFormatException e) {
                                        ;
                                    }
                                }
                            }
                        }

                        lastWarning = null;
                    }
                }
            }
        }
        if (lastWarning != null) {
            if (!SUCCESS_PATTERN.matcher(lastWarning).matches()) {
                throw new EncoderException(lastWarning);
            }
        }
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } finally {
        ffmpeg.destroy();
    }
}

请告知,如何实现视频轮播没有任何视频帧丢失

提前致谢

拉克希米普里亚。 ķ

1 个答案:

答案 0 :(得分:0)

工作了几天,最后尝试将旋转的视频写入不同的目标文件,然后我得到视频输出而没有任何损失,视频也被旋转....

由于

拉克希米普里亚。 ķ