0

J'ai besoin de transcoder une vidéo en résolution 640 * 480 en utilisant Xamarin.MP4Transcoder.Transcoder. Actuellement, il existe 2 résolutions disponibles 720pFormat et 960x540Format. Il existe une méthode appelée Transcoder For (IMediaFormatStrategy strategy) disponible en classe Transcoder.Comment transcoder une vidéo en résolution personnalisée en utilisant Xamarin.MP4Transcoder.Transcoder

Je peux créer un objet MediaFormat avec le type MIME, largeur et hauteur par Mentionnés ci-dessous l'extrait de code:

MediaFormat obj = MediaFormat.CreateVideoFormat("video/mp4", 480, 640);


mais le problème est de savoir comment peut l'assigner à IMediaFormatStrategy ou est-il autre moyen d'y parvenir.

Piece of code for Transcoding a video: 
 

 
Xamarin.MP4Transcoder.Transcoder.For960x540Format().ConvertAsync(inputFile, outputFile, f =>
 \t \t \t \t {
 \t \t \t \t onProgress?.Invoke((int)(f * (double)100), 100);

 \t \t \t \t 
 \t \t \t \t }); 
 

 
inputFile: Video file which needs to be transcoded. 
 
outputFile: Resultant file generated after transcoding.

Pour plus d'informations, vous pouvez consulter https://github.com/neurospeech/xamarin-android-ffmpeg

Toute aide est appréciée. Merci d'avance!!

Répondre

0

Je devais faire la même chose, et heureusement trouvé comment il a été fait en Java, et puis j'ai juste dû le convertir en C#.

La classe résultante (pour 640x360) ressemble à ceci:

public class For640x360Format : Java.Lang.Object, IMediaFormatStrategy 
{ 
    public static int AUDIO_BITRATE_AS_IS = -1; 
    public static int AUDIO_CHANNELS_AS_IS = -1; 
    static String TAG = "640x360FormatStrategy"; 
    static int LONGER_LENGTH = 640; 
    static int SHORTER_LENGTH = 360; 
    static int DEFAULT_VIDEO_BITRATE = 8000 * 1000; // From Nexus 4 Camera in 720p 
    int mVideoBitrate; 
    int mAudioBitrate; 
    int mAudioChannels; 

    public For640x360Format() 
    { 
     mVideoBitrate = DEFAULT_VIDEO_BITRATE; 
     mAudioBitrate = AUDIO_BITRATE_AS_IS; 
     mAudioChannels = AUDIO_CHANNELS_AS_IS; 
    } 

    public For640x360Format (int videoBitrate) 
    { 
     mVideoBitrate = videoBitrate; 
     mAudioBitrate = AUDIO_BITRATE_AS_IS; 
     mAudioChannels = AUDIO_CHANNELS_AS_IS; 
    } 

    public For640x360Format (int videoBitrate, int audioBitrate, int audioChannels) 
    { 
     mVideoBitrate = videoBitrate; 
     mAudioBitrate = audioBitrate; 
     mAudioChannels = audioChannels; 
    } 

    public MediaFormat CreateAudioOutputFormat (MediaFormat inputFormat) 
    { 
     if (mAudioBitrate == AUDIO_BITRATE_AS_IS || mAudioChannels == AUDIO_CHANNELS_AS_IS) return null; 

     // Use original sample rate, as resampling is not supported yet. 
     MediaFormat format = MediaFormat.CreateAudioFormat (MediaFormatExtraConstants.MimetypeAudioAac, 
                  inputFormat.GetInteger (MediaFormat.KeySampleRate), 
                  mAudioChannels); 
     // this is obsolete: MediaCodecInfo.CodecProfileLevel.AACObjectLC, so using MediaCodecProfileType.Aacobjectlc instead 
     format.SetInteger (MediaFormat.KeyAacProfile, (int)MediaCodecProfileType.Aacobjectlc); 
     format.SetInteger (MediaFormat.KeyBitRate, mAudioBitrate); 
     return format; 
    } 

    public MediaFormat CreateVideoOutputFormat (MediaFormat inputFormat) 
    { 
     int width = inputFormat.GetInteger (MediaFormat.KeyWidth); 
     int height = inputFormat.GetInteger (MediaFormat.KeyHeight); 
     int longer, shorter, outWidth, outHeight; 

     if (width >= height) 
     { 
      longer = width; 
      shorter = height; 
      outWidth = LONGER_LENGTH; 
      outHeight = SHORTER_LENGTH; 
     } 
     else 
     { 
      shorter = width; 
      longer = height; 
      outWidth = SHORTER_LENGTH; 
      outHeight = LONGER_LENGTH; 
     } 

     if (longer * 9 != shorter * 16) 
     { 
      throw new OutputFormatUnavailableException ("This video is not 16:9, and is not able to transcode. (" + width + "x" + height + ")"); 
     } 
     if (shorter <= SHORTER_LENGTH) 
     { 
      #if DEBUG 
      Console.WriteLine ("This video is less or equal to 720p, pass-through. (" + width + "x" + height + ")"); 
      #endif 

      return null; 
     } 

     MediaFormat format = MediaFormat.CreateVideoFormat ("video/avc", outWidth, outHeight); 
     format.SetInteger (MediaFormat.KeyBitRate, mVideoBitrate); 
     format.SetInteger (MediaFormat.KeyFrameRate, 30); 
     format.SetInteger (MediaFormat.KeyIFrameInterval, 3); 
     // this is obsolete: MediaCodecInfo.CodecCapabilities.COLORFormatSurface, so using MediaCodecCapabilities.Formatsurface instead 
     format.SetInteger (MediaFormat.KeyColorFormat, (int)MediaCodecCapabilities.Formatsurface); 

     return format; 
    } 
} 

changer juste LONGER_LENGTH et SHORTER_LENGTH à ce que la résolution dont vous avez besoin et, de toute évidence, créer une nouvelle classe pour elle. Pourrait probablement aussi juste faire une classe générique qui prend dans les deux longueurs, mais je n'ai pas encore eu besoin de lui.

Link to the Java code