Как перекодировать файл фильма с помощью Xuggler - PullRequest
0 голосов
/ 08 декабря 2011

Это, должно быть, очень глупый вопрос, но как перекодировать с помощью Xuggler?Упрощенно у меня есть:

IMediaReader reader = ToolFactory.makeReader(sourceUrl);      
IMediaWriter writer = ToolFactory.makeWriter(url, reader);

MediaSegmenterWriter writerListener = new MediaSegmenterWriter();
writer.open();
while (reader.readPacket() == null)
   do {
     } 
while(false);

Теперь я хочу перекодировать файл в ридере с другим битрейтом и разрешением.Как я могу это сделать?При создании писателя я попытался добавить IMediaStreams с копией исходного кодера с необходимыми изменениями, но это не работает:

    int numStreams = reader.getContainer().getNumStreams();
    for(int i = 0; i < numStreams; i++)
    {
        final IStream stream = reader.getContainer().getStream(i);
        final IStreamCoder coder = stream.getStreamCoder();

        IStreamCoder newCoder = IStreamCoder.make(IStreamCoder.Direction.ENCODING, coder);
        if(newCoder == null ){
            continue;
        }
        writer.getContainer().addNewStream(i);

        int streams = writer.getContainer().getNumStreams();
        System.out.println("Current amount of streams in writer: " + streams);

        System.out.println("Coder: " + coder.toString());
        if (coderSetting != null && newCoder != null){
            if (newCoder.getCodecType().equals(ICodec.Type.CODEC_TYPE_VIDEO)) {
                newCoder.setWidth(320);
                newCoder.setHeight(240);                   
            } 
            IStream outputStream = writer.getContainer().getStream(i);
            outputStream.setStreamCoder(newCoder);
            newCoder.open();
          }
    }

Но это просто дает тот же результат, что и пропуск кода (например, 1920x1080 от оригинала)

Также пытался добавить слушателя к записывающему устройству и заменить кодер, но либо получил ошибку (кодер уже открыт_ или эффекта нет. (onOpen, onAddStream, onOpenCoder))

Я искал учебные пособия, но, похоже, эта простая операция не выполняется.

Любая помощь будет ДЕЙСТВИТЕЛЬНО оценена !!!

Ответы [ 2 ]

1 голос
/ 04 апреля 2012

Чтобы изменить размер содержимого, а также перекодировать, вам необходимо создать MediaToolAdapter, например:

private static class MediaResizer extends MediaToolAdapter {
    private IVideoResampler videoResampler = null;
    private int mediaHeight;
    private int mediaWidth;

    public MediaResizer (int aHight, int aWidth) {
        mediaWidth = aWidth;
        mediaHeight = aHeight;
    }

    @Override
    public void onVideoPicture(IVideoPictureEvent event) {
        // In case of audio only, do not re-size as it is not needed
        if(job.role == MediaRole.MediaRoleEnum.LS_AUDIO) super.onVideoPicture(event);

        IVideoPicture pic = event.getPicture();

        if (videoResampler == null) {
            videoResampler = IVideoResampler.make(job.getCoderSettings().width, job.getCoderSettings().height, pic.getPixelType(), pic.getWidth(), pic.getHeight(), pic.getPixelType());
        }

        IVideoPicture out = IVideoPicture.make(pic.getPixelType(), mediaWidth, mediaHeight);
        videoResampler.resample(out, pic);

        IVideoPictureEvent asc = new VideoPictureEvent(event.getSource(), out, event.getStreamIndex());
        super.onVideoPicture(asc);

        out.delete();
    }

}

. Вы добавляете его в качестве прослушивателя для своего читателя, а затем ваш писатель для вас изменяет размер.Это должно быть что-то вроде:

 IMediaReader reader = ToolFactory.makeReader(sourceUrl);
 MediaResizer resizer = new MediaResizer(job);
 IMediaWriter currentWriter = ToolFactory.makeWriter(destinationDir, reader);

 reader.addListener(resizer);
 resizer.addListener(currentWriter);
0 голосов
/ 17 января 2017

@ Мухаммед Умар, может, он имеет в виду:

@Override
    public void onVideoPicture(IVideoPictureEvent event) {
//        Logger.info("onAddStream(): now I am in VideoConverter.onVideoPicture().....");
        IVideoPicture pic = event.getPicture();
        if (videoResampler == null) {
            videoResampler = IVideoResampler.make(VIDEO_WIDTH, VIDEO_HEIGHT,
                    pic.getPixelType(), pic.getWidth(), pic.getHeight(),
                    pic.getPixelType());
        }

        IVideoPicture out = IVideoPicture.make(pic.getPixelType(), VIDEO_WIDTH, VIDEO_HEIGHT);

        videoResampler.resample(out, pic);
        IVideoPictureEvent asc = new VideoPictureEvent(event.getSource(), out, event.getStreamIndex());
        super.onVideoPicture(asc);
        out.delete();
    }
...