GPUImage завершает работу из-за [AVAssetWriter startWriting] Не удается вызвать метод, когда статус равен 3 '

У меня проблема с запуском GPUImage. Я модифицировал программу SimpleVideoFileFilter (заменил фильтр фильтром хромакей) и использую собственное видео. Моя программа завершается из-за следующей ошибки:

[AVAssetWriter startWriting] Невозможно вызвать метод, когда статус равен 3'

Я просмотрел форумы, но не уверен, почему кинорайтер закрывается, а потом кто-то пишет ему.

Я использую iPhone4 под управлением iOS 7.0.

Любые подсказки приветствуются. Спасибо большое!


person user2869423    schedule 11.10.2013    source источник
comment
AVAssetWriterStatusFailed — это статус, подразумеваемый «3» вот соответствующее место в Документах Apple Этому может быть много возможных причин, но вам придется опубликовать свой код, чтобы мы могли сделать обоснованные предложения. Не могли бы вы опубликовать, как вы настраиваете фильтр и как вы получаете NSURL для своего видео?   -  person ryan cumley    schedule 15.10.2013
comment
Пожалуйста, найдите код для настройки фильтра и NSURL для видео. Спасибо   -  person user2869423    schedule 25.10.2013
comment
Я встретил это прошлой ночью, и я решил это, исправив URL-адрес, поэтому проверьте URL-адрес   -  person aKerdi    schedule 01.01.2017
comment
@aKerdi Не могли бы вы описать, как вы это решили?   -  person Seasia Creative Crew    schedule 11.01.2017


Ответы (6)


Проверьте, существует ли уже ваш конечный файл. Если это так, удалите его.

person Darktt    schedule 31.07.2014

Я пытался добавить файл в несуществующий каталог. Пример: /Videos/Video.mov , если оставить просто /Video.mov, сработало.

person Sam Bing    schedule 28.06.2017

Хорошо, у меня есть несколько идей для вас.

Когда вы говорите «он просто показывает кадр и никогда не воспроизводит видео», у нас есть хороший признак того, что весь ваш конвейер обработки от начала до конца работает ровно один раз, а затем перестает работать.

Это говорит нам о том, что вы правильно соединяете вещи, но некоторые компоненты не существуют дольше, чем один цикл буфера кадра, и впоследствии весь процесс останавливается.

похоже, что filter и movieWriter привязаны к классу (я предполагаю, что они не являются свойствами из-за отсутствия подчеркивания, _filter and _movieWriter). Так что они будут жить после того, как этот метод закончится (поправьте меня, если я ошибаюсь...)

Я думаю, что проблема, с которой вы столкнулись, связана с вашим (GPUImageView*)displayView

Это, вероятно, следует объявить как свойство класса (хотя оно может работать как просто переменную), а затем создать экземпляр с помощью nib или метода viewDidLoad контроллера представления.

Как у вас сейчас, эта строка: GPUImageView* filterView = (GPUImageView*)displayView; делает назначение для filterView, который не используется (и, следовательно, не нужен). Неясно, действительно ли displayView является экземпляром GPUImageView или он все еще будет существовать, когда текущий метод завершится. (на самом деле вы говорите, что это «UIView, который я создал программно»)

displayView должен быть подклассом GPUImageView, чтобы все это работало, и он должен быть привязан к классу, а не к методу.

Объявите это так:

@property (strong, nonatomic)GPUImageView* displayView;

а затем создайте его и добавьте в иерархию представлений изнутри viewDidLoad

person ryan cumley    schedule 24.10.2013
comment
TL;DR простое приведение displayView к GPUImageView может обмануть компилятор, но приложению абсолютно НЕОБХОДИМО отображать представление, чтобы оно было фактическим подклассом GPUImageView для запуска. - person ryan cumley; 25.10.2013
comment
Еще два момента, с которыми, как мне кажется, вы столкнетесь после запуска: вызов ‹code›finishRecording‹/code› из блока завершения GPUImageMovieWriter, скорее всего, приведет вас к бесконечному циклу вызова блока завершения. - person ryan cumley; 25.10.2013
comment
И вы можете рассмотреть ‹code›- (id)initWithMovieURL:(NSURL *)newMovieURL size:(CGSize)newSize fileType:(NSString *)newFileType outputSettings:(NSMutableDictionary *)outputSettings; ‹/code› для более тонкого контроля над movieWriter - person ryan cumley; 25.10.2013
comment
Я попытался объявить displayView (кстати, это свойство) как GPUImageView, но результат не изменился. Но я бы, по крайней мере, хотел бы иметь возможность записывать выходное видео в файл, чтобы я мог его воспроизвести. Я не могу написать это успешно. Если удалить блок завершения для movieWriter, это не дает мне ошибки, но выходной файл пуст. Если я даю блок завершения, он вылетает со следующей ошибкой: - person user2869423; 25.10.2013
comment
Я изменил свой код, чтобы использовать weakSelf при ссылке на себя в блоке завершения. Результат не изменился. Спасибо. - person user2869423; 25.10.2013

if (outputPath) {
                finalURL = [[stongObj tempFileURL] copy];
                DebugLog(@"Start Filter Processing :%@",finalURL);
                DebugLog(@"movieUrl :%@",movieUrl);

         //   [CSUtils removeChuckFilePaths:@[outputPath]];


            //Create Image Movie Object
            _movieFile = [[GPUImageMovie alloc] initWithURL:outputPath];
            //_movieFile = [[GPUImageMovie alloc] initWithURL:[[NSBundle mainBundle] URLForResource:@"videoviewdemo" withExtension:@"mp4"]];
            _movieFile.runBenchmark = NO;
            _movieFile.playAtActualSpeed = YES;
            _movieFile.delegate = self;

            //Movie Writer Object
            _movieWriter = [[GPUImageMovieWriter alloc] initWithMovieURL:finalURL size:CGSizeMake([UIScreen mainScreen].bounds.size.height,[UIScreen mainScreen].bounds.size.height)];
            //_movieWriter.delegate = self;

            //Create Selecetive GPU Image Filter
            [stongObj setGpuOutputFilter:selectedVideoFilterType];

            //Create Group Filter
            groupFilter = [[GPUImageFilterGroup alloc] init];
            [groupFilter addTarget:imageOutputFilter];

            // Only Single Filter is implemented.
            //Apply Initial and Terminal Filter
            [(GPUImageFilterGroup *)groupFilter setInitialFilters:[NSArray arrayWithObject:imageOutputFilter]];
            [(GPUImageFilterGroup *)groupFilter setTerminalFilter:imageOutputFilter];

            //_movieWriter -> groupFilter ->_movieFile
            [_movieFile addTarget:groupFilter];
            [groupFilter addTarget:_movieWriter];

            _movieWriter.shouldPassthroughAudio = YES;
            _movieFile.audioEncodingTarget = _movieWriter;
            [_movieFile enableSynchronizedEncodingUsingMovieWriter:_movieWriter];

            //Start Recording
            [_movieWriter startRecording];
            //Start Processing
            [_movieFile startProcessing];

            __weak typeof(self) weekSelf=self;
            [_movieWriter setCompletionBlock:^{

                __strong typeof(self) stongSelf=weekSelf;

                DebugLog(@"Movie Write Completed");
                //Finish Recording.
                [stongSelf.movieWriter finishRecording];

                //Release all object
                // [self releaseAllObject];

                //remove movieUrl,audioUrl,outputPath
                [CSUtils removeChuckFiles:@[movieUrl,audioUrl,outputPath]];

            }];

[_movieFile startProcessing]; приложение вылетает в iOS 8 на этой строке, но отлично работает на iOS 7

person Girijesh Kumar    schedule 25.05.2015
comment
dropbox.com/s/fqgzwouieundyfn/VideoFilter.zip?dl=0 вот пример исходного кода - person Girijesh Kumar; 29.05.2015

@Seasia Creative, у меня недостаточно репутации, чтобы добавить комментарий к этому списку, я создаю новый список, чтобы ответить U. Я проверяю выходной URL, журнал консоли "/var~~~~/tmpmerge.mp4", так что я понимаю что я пропустил "/" --->"/var~~~~/tmp/merge.mp4". Если URL-адрес неверен, проект сталкивается с той же ошибкой. надеюсь помочь некоторым.

person aKerdi    schedule 16.01.2017

person    schedule
comment
Пожалуйста, найдите мой код... displayView — это UIView, который я программно создал в центре одного из контроллеров представления, но видео не воспроизводится в представлении. Он просто показывает кадр и никогда не воспроизводит видео. Любая помощь приветствуется. Спасибо - person user2869423; 24.10.2013
comment
Я преодолел сбой, просто изменив порядок [movieFile startProcessing]. Но теперь приложение входит в цикл утечки памяти и в конечном итоге завершается из-за нехватки памяти. Instruments указывает на [AVAssetWriterInput _helper] как на источник утечки. Любые подсказки приветствуются. - person user2869423; 26.10.2013