2016-01-14 5 views
4

Je construis une application iOS où le recodage et le découpage d'une vidéo en arrière-plan est nécessaire.Comment faire pour couper un fichier avec FFMpeg par programme? (libavformat, avutils, ...)

Je ne peux pas utiliser les bibliothèques iOS (AVFoundation) car elles dépendent du GPU et aucune application ne peut accéder au GPU si elle est en arrière-plan.

En raison de ce problème je suis passé à FFMpeg et l'ai compilé (avec libx264) et l'ai intégré sur mon application iOS.

Pour résumer ce que j'ai besoin est:

  1. couper la vidéo pour les 10 premières secondes
  2. re échelle la vidéo

Après quelques semaines - et cognant ma tête contre le mur assez souvent - j'ai réussi à:

  • diviser le conteneur vidéo en flux (démultiplexage)
  • copier le flux audio dans le flux de sortie (pas de décodage ou d'encodage)
  • décoder le flux vidéo, exécuter les filtres nécessaires par trame, encoder chaque trame résultante et le remixer au flux de sortie (je décode le h264, filtre elle, réencoder revenir à h264)

Si je devais courir ffmpeg par la ligne de commande je courrais comme ceci:

ffmpeg -i input.MOV -ss 0 -t 10 -vf scale=320:240 -c:v libx264 -preset ultrafast -c:a copy output.mkv 

Mon souci est de savoir comment couper la vidéo? Bien que je puisse compter le nombre de trames vidéo que je code/décode et basé sur le FPS décider quand arrêter je ne peux pas faire la même chose avec l'audio puisque je ne fais que le démultiplexer et le remixer.

Idéalement, avant de mettre à l'échelle la vidéo, j'effectuerais un processus pour découper la vidéo en copiant les 10 secondes de chaque flux (vidéo et audio) dans un nouveau conteneur vidéo. Comment puis-je y parvenir à travers les bibliothèques AV?

Répondre

-1

Je sais que vous pouvez le faire avec un appel à ffmpeg:

ffmpeg -i input.MOV -filter_complex [0:v]trim=duration=10.0,scale=320:240[vid];[0:a]atrim=duration=10.0[aud] -map [vid] -map [aud] -c:v libx264 -preset ultrafast -c:a libvo_aacenc -b:a 128k -flags +aic+mv4 output.mkv