FFmpeg iOS - >输出文件无效

时间:2016-07-12 10:34:12

标签: ios objective-c ffmpeg mp4 aac

我使用以下库将mkv转换为mp4:https://github.com/SterlingOnLoop/FFmpegWrapper

- (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秒长。它无法在我的Mac上使用VLC播放(似乎已被破坏)。我收到了以下错误(我已经粘贴了一些错误,可以找到完整的跟踪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使用此编码,因此它应该有效。

1 个答案:

答案 0 :(得分:1)

我检查了你的档案。我能看到的主要问题是:

  • 没有音频比特率(即:应设置128kbps)
  • 元数据以某种方式将AAC版本列为4(这甚至意味着什么?)。
  • 编解码器ID应为40,但在MKV的元数据中,它列为A_AAC/MPEG4/LC
  • 字节中没有通道位置标志(即:前L + R)

无论如何ffmpeg(命令行)转换了您的MKV没有任何错误。
请告诉我这个新的 re-encoded MP4 版本是否适合您。

ffmpeg设置只是:ffmpeg -i mkv_demo.mkv -c:v copy demo_new.mp4

不幸的是我不在iOS中编码,因此我无法向您显示“固定”代码。也许有人可以在以后帮忙。请查看其他 Answer 以获取额外提示(使其像上面显示的命令行代码段一样工作)...