FFmpeg iOS-> archivo de salida no es válido
objective-c mp4 (1)
Estoy usando la siguiente biblioteca para convertir mkv a 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.");
}
}];
}
Estos son los valores de LLDB sobre los tipos de códec detectados automáticamente:
(lldb) po inputStream.codecName
aac
(lldb) po outputStream.codecName
aac
Debo mencionar aquí, que originalmente el archivo se genera en Linux con los siguientes códecs: vaapiencode_h264
para video y faac
para sonido.
El problema es que el archivo simplemente no funciona. Recibo una gran cantidad de registros en la consola, donde lo más importante es:
[aac @ 0x7f7f65019200] Format aac detected only with low score of 1, misdetection possible!
Dentro de la biblioteca, se usa la siguiente función:
int streamInfoValue = avformat_find_stream_info(inputFormatContext, NULL);
Y exactamente esta línea hace todo el lío con los registros. Obviamente, sin esta línea recibo un error con argumento inválido.
Cuando esa línea está activada, se genera el archivo .mp4. Tiene una duración de> 5 minutos, mientras que el archivo de entrada dura 11 segundos. No se puede jugar usando VLC en mi mac (parece estar roto). Recibo los siguientes errores (estoy pegando algunos de ellos, la pista completa se puede encontrar aquí , es demasiado larga para citarla aquí):
[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
¿Alguna idea de cómo simplemente convertir mkv a mp4? No tengo idea de por qué ocurren los errores. Yo diría que el archivo no es aac, pero Linux usa esta codificación, por lo que debería ser válida.
He revisado tu archivo. Los principales problemas que puedo ver es que:
- No hay una tasa de bits de audio (es decir, se deben establecer 128kbps)
- De alguna manera, los metadatos enumeran la versión AAC como 4 (¿qué significa eso?).
- La ID del códec debe ser
40
pero en los metadatos del MKV figura comoA_AAC/MPEG4/LC
- No hay indicador para la posición del canal en los bytes (es decir: Front L + R)
De todos modos, ffmpeg (línea de comandos) convirtió tu MKV sin ningún error.
Avíseme si esta nueva versión MP4 re-codificada funciona bien de su lado.
Los ajustes de ffmpeg fueron simples: ffmpeg -i mkv_demo.mkv -c:v copy demo_new.mp4
Lamentablemente, no codigo en iOS, así que no pude mostrar un código "fijo". Tal vez alguien pueda ayudar más adelante. Mire esta otra respuesta para obtener sugerencias adicionales (haga que funcione como se muestra en el fragmento de línea de comandos que se muestra arriba) ...