2016-07-12 15 views
4

Я использую следующую библиотеку для преобразования mkv в mp4: https://github.com/SterlingOnLoop/FFmpegWrapper.FFmpeg iOS -> выходной файл недействителен

- (void)convertUsingFFmpegWrapper { 
    NSString *mp4Extension = @"mp4"; 
    NSString *mkvExtension = @"mkv"; 

    NSString *videoName = @"file1"; 
// NSString *videoName = @"file2"; 

    NSString *mkvVideoFilePath = [[NSBundle mainBundle] pathForResource:videoName ofType:mkvExtension]; 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = paths[0]; 
    NSString *mp4VideoFilePath = [NSString stringWithFormat:@"%@/%@.%@", documentsDirectory, videoName, mp4Extension]; 

    FFmpegWrapper *ffmpegWrapper = [[FFmpegWrapper alloc] init]; 
    NSDictionary *options = @{kFFmpegInputFormatKey: mkvExtension, kFFmpegOutputFormatKey: mp4Extension}; 
    [ffmpegWrapper convertInputPath:mkvVideoFilePath outputPath:mp4VideoFilePath options:options progressBlock:nil completionBlock:^(BOOL success, NSError *error) { 
     if (success && !error) { 
      // delete mp4 file 
     } else if (error) { 
      NSLog(@"Error during .MKV -> .MP4 conversion occured: %@", error.localizedDescription); 
     } else { 
      NSLog(@"Unknown error during .MKV -> .MP4 conversion occured."); 
     } 
    }]; 
} 

Ниже приведены значения из LLDB о автоматически обнаруженных типов кодеков:

(lldb) po inputStream.codecName 
aac 

(lldb) po outputStream.codecName 
aac 

я должен упомянуть, что изначально файл генерируется на Linux со следующими кодеками: vaapiencode_h264 для видео и faac для звук.

Проблема в том, что файл просто не работает. Я получаю огромное количество журналов в консоли, где наиболее важным является:

[aac @ 0x7f7f65019200] Format aac detected only with low score of 1, misdetection possible! 

Внутри библиотеки, используется следующая функция:

int streamInfoValue = avformat_find_stream_info(inputFormatContext, NULL); 

И именно эта линия делает весь беспорядок с бревнами , Очевидно, без этой строки я получаю сообщение об ошибке с недопустимым аргументом.

Когда эта строка включена, генерируется файл .mp4. Он длится> 5 минут, а входной файл - 11 секунд. Он не может быть воспроизведен с использованием VLC на моем mac (кажется, что он был сломан). Я получаю следующие ошибки (я вставив несколько из них, полный трек можно найти here, это слишком долго, чтобы процитировать его здесь):

[aac @ 0x7ff07c00b000] More than one AAC RDB per ADTS frame is not implemented. Update your FFmpeg version to the newest one from Git. If the problem still occurs, it means that your file has a feature which has not been implemented. 
[aac @ 0x7ff07c00b000] channel element 0.0 is not allocated 
[aac @ 0x7ff07c00b000] Sample rate index in program config element does not match the sample rate index configured by the container. 
[aac @ 0x7ff07c00b000] Inconsistent channel configuration. 
[aac @ 0x7ff07c00b000] get_buffer() failed 
[aac @ 0x7ff07c00b000] channel element 3.10 is not allocated 
[aac @ 0x7ff07c00b000] Reserved bit set. 
[aac @ 0x7ff07c00b000] invalid band type 
[aac @ 0x7ff07c00b000] Number of scalefactor bands in group (50) exceeds limit (41). 
[aac @ 0x7ff07c00b000] Reserved bit set. 
[aac @ 0x7ff07c00b000] Number of bands (7) exceeds limit (4). 
[aac @ 0x7ff07c00b000] Reserved bit set. 
[aac @ 0x7ff07c00b000] Dependent coupling is not supported together with LTP 

Любая идея, как просто конвертировать MKV в MP4? Я не знаю, почему возникают ошибки. Я бы сказал, что файл не aac, но linux использует эту кодировку, поэтому он должен быть действительным.

+0

Все ваши ошибки исходят из одной вещи, так называемого аудио AAC. Можно ли установить временную ссылку на файл MKV для анализа? –

+0

@ VC.One Конечно, спасибо! :) Вот ссылка на маленький (4MB) файл mkv: http://s000.tinyupload.com/?file_id = 05753933961175453657 – Vive

+0

@Vive Я просто хотел узнать, как вы интегрировали эту библиотеку, так как мне также нужно ее интегрировать. Я не смог интегрировать эту библиотеку. Не могли бы вы мне помочь? Заранее спасибо –

ответ

1

Я проверил ваш файл. Основные вопросы, я могу видеть, что:

  • Там нет аудио битрейт (то есть: 128kbps должен быть установлен)
  • Как-то метаданные перечислены версии AAC, как 4 (что это вообще значит ??).
  • Кодека ID должен быть 40, но в метаданных мов в это перечислено в A_AAC/MPEG4/LC
  • Там нет флага для канала позиции в байтах (то есть: Front L + R)

Любого FFmpeg (командная строка) превратили ваш MKV без каких-либо ошибок.
Дайте мне знать, если эта новая версия re-encoded MP4 работает нормально на вашей стороне.

В FFmpeg настроек были просто: ffmpeg -i mkv_demo.mkv -c:v copy demo_new.mp4

К сожалению, я не коду в прошивке, так что я не мог показать вам «фиксированный» код. Может быть, кто-то может помочь позже. Посмотрите на это другое Answer за дополнительные подсказки (чтобы он работал, как показано выше в командной строке) ...

+0

Привет, VC.One, во-первых, спасибо за вашу глубокую помощь! Как вы проверили всю следующую информацию, какую программу вы использовали? Лучше знать, как ловить рыбу, а не добывать рыбу :). Еще раз, я очень ценю помощь, поскольку я мало знаю об аудиоформатах, и это дало мне сильный урок. Перекодированный MP4 работает отлично. Я попытаюсь обновить метаданные, а затем преобразование. – Vive

+0

Также я попытался проверить, что информация codecID и 'A_AAC/MPEG5/LC' представляется действительной в соответствии с: https://matroska.org/technical/specs/codecid/index.html. Почему это недействительно? – Vive

+1

Хотя ваш ответ действительно, я только что закончил с использованием реализации C, и это сработало. Поэтому кажется, что оболочка, которую я пытался использовать, была недействительна. – Vive