Exemple #1
0
 /// <summary>
 /// Gets the audio encoder with the specified codec ID.
 /// </summary>
 /// <param name="codecId">
 /// The ID of the audio encoder.
 /// </param>
 /// <returns>
 /// The requested audio encoder.
 /// </returns>
 public static HBAudioEncoder GetAudioEncoder(int codecId)
 {
     return(AudioEncoders.SingleOrDefault(e => e.Id == codecId));
 }
        /// <summary>
        /// Inicializa a classe de transcodificação passando diretamente o Encodificador que vai processar os dados de entrada para gerar o arquivo
        /// de saida.
        /// </summary>
        /// <param name="Param_EncoderSaida">Uma interface ICarenMFMediaSink para o Sink/Encoder do tipo de áudio de saida. Consulte os métodos das class MediaFoundationFunctions para obter
        /// um encodificador.</param>
        /// <param name="Param_AudioFormatoEntrada">Estrutura que contém as informações do tipo de áudio de entrada a ser convertido.</param>
        public MFTTranscodeApi(AudioEncoders Param_AudioEncoderOutput, String Param_UrlOutputFile, CA_WAVEFORMATEXEXTENSIBLE Param_AudioFormatoEntrada)
        {
            //Variavel que vai conter os resultados das operações.
            CarenResult Resultado = new(ResultCode.ER_FAIL, false);

            //Converte a estrutura com o formato de áudio de entrada em uma interface ICarenMFMediaType.
            Resultado = MFTFuncs._MFInitMediaTypeFromWaveFormatEx(ref Param_AudioFormatoEntrada, Param_AudioFormatoEntrada.TamanhoEstrutura, myTranscodeApi.TypeInput = new CarenMFMediaType(false));

            //Verifica se não houve erro.
            if (Resultado.StatusCode != ResultCode.SS_OK)
            {
                //Ocorreu uma falha..

                //Chama uma exceção.
                throw new Exception($"Ocorreu uma falha ao tentar converter a estrutura (CA_WAVEFORMATEXEXTENSIBLE). Code({Resultado.StatusCode.ToString()}) - Mensagem de erro > " + Resultado.ObterMensagem(Resultado.HResult));
            }

            //Chama a função para deletar o arquivo se já existir.
            File.Delete(Param_UrlOutputFile);

            //Cria o fluxo para o arquivo de saida a receber os dados codificados.
            myTranscodeApi.StreamToFile = new CarenStream(Param_UrlOutputFile, CA_STGMs.CA_STGM_READWRITE, CA_FILE_ATTRIBUTES.CA_FILE_ATTRIBUTE_NORMAL, true);

            //Cria o fluxo da Media Foundation com base no fluxo criado anteriormente.
            myTranscodeApi.MFByteStream = new CarenMFByteStream(myTranscodeApi.StreamToFile);

            //Verifica qual o tipo do encodificador selecionado pelo usuário e cria.
            switch (Param_AudioEncoderOutput)
            {
            case AudioEncoders.MP3:
            {
                //Chama o método para criar o dissipador de mídia escolhido pelo usuário.
                Resultado = MFTFuncs._MFCreateMP3MediaSink(myTranscodeApi.MFByteStream, myTranscodeApi.Encoder = new CarenMFMediaSink());

                //Verifica se não houve erro.
                if (Resultado.StatusCode != ResultCode.SS_OK)
                {
                    //Ocorreu uma falha..

                    //Chama uma exceção.
                    throw new Exception($"Ocorreu uma falha ao tentar criado o encodificador de dados. Code({Resultado.StatusCode.ToString()}) - Mensagem de erro > " + Resultado.ObterMensagem(Resultado.HResult));
                }

                //Chama o método para criar o escritor com o encodificador inicializado.
                myTranscodeApi.Escritor = new CarenMFSinkWriter(myTranscodeApi.Encoder, null);

                //Define o tipo de mídia de entrada.
                Resultado = myTranscodeApi.Escritor.SetInputMediaType(0, myTranscodeApi.TypeInput, null);

                //Verifica se não houve erro.
                if (Resultado.StatusCode != ResultCode.SS_OK)
                {
                    //Ocorreu uma falha..

                    //Chama uma exceção.
                    throw new Exception($"Ocorreu uma falha ao definir o tipo de mídia de entrada. Code({Resultado.StatusCode.ToString()}) - Mensagem de erro > " + Resultado.ObterMensagem(Resultado.HResult));
                }
            }
            break;

            case AudioEncoders.AAC:
            {
                //Cria a interface do tipo de mídia que vai conter no arquivo.
                myTranscodeApi.TypeOutputStreamAudioMPEG4 = new CarenMFMediaType(true);

                //Define os atributos para o tipo encodificado.
                myTranscodeApi.TypeOutputStreamAudioMPEG4.SetGUID(GUIDs_MF_MEDIATYPE_ATTRIBUTES.MF_MT_MAJOR_TYPE, GUIDs_MFAttributes_MAJOR_TYPES.MFMediaType_Audio);
                myTranscodeApi.TypeOutputStreamAudioMPEG4.SetGUID(GUIDs_MF_MEDIATYPE_ATTRIBUTES.MF_MT_SUBTYPE, GUIDs_MF_AUDIO_SUBTYPES.MFAudioFormat_AAC);
                myTranscodeApi.TypeOutputStreamAudioMPEG4.SetUINT32(GUIDs_MF_MEDIATYPE_ATTRIBUTES.MF_MT_AUDIO_BITS_PER_SAMPLE, Param_AudioFormatoEntrada.Format.wBitsPerSample);
                myTranscodeApi.TypeOutputStreamAudioMPEG4.SetUINT32(GUIDs_MF_MEDIATYPE_ATTRIBUTES.MF_MT_AUDIO_SAMPLES_PER_SECOND, Param_AudioFormatoEntrada.Format.nSamplesPerSec);
                myTranscodeApi.TypeOutputStreamAudioMPEG4.SetUINT32(GUIDs_MF_MEDIATYPE_ATTRIBUTES.MF_MT_AUDIO_NUM_CHANNELS, Param_AudioFormatoEntrada.Format.nChannels);
                myTranscodeApi.TypeOutputStreamAudioMPEG4.SetUINT32(GUIDs_MF_MEDIATYPE_ATTRIBUTES.MF_MT_AUDIO_AVG_BYTES_PER_SECOND, 12000);                                                                              //A quantidade de Bytes per second encodificado(IMPORTANTE).
                myTranscodeApi.TypeOutputStreamAudioMPEG4.SetUINT32(GUIDs_MF_MEDIATYPE_ATTRIBUTES.MF_MT_AAC_PAYLOAD_TYPE, 0);
                myTranscodeApi.TypeOutputStreamAudioMPEG4.SetUINT32(GUIDs_MF_MEDIATYPE_ATTRIBUTES.MF_MT_AAC_AUDIO_PROFILE_LEVEL_INDICATION, (uint)CA_AUDIO_AAC_PROFILE_LEVEL_INDICATION.PerfilAAC_HighEfficiency_V1_L2); //Perfil AAC

                //Chama o método para criar o dissipador de mídia escolhido pelo usuário.
                Resultado = MFTFuncs._MFCreateMPEG4MediaSink(myTranscodeApi.MFByteStream, null, myTranscodeApi.TypeOutputStreamAudioMPEG4, myTranscodeApi.Encoder = new CarenMFMediaSink());

                //Verifica se não houve erro.
                if (Resultado.StatusCode != ResultCode.SS_OK)
                {
                    //Ocorreu uma falha..

                    //Chama uma exceção.
                    throw new Exception($"Ocorreu uma falha ao tentar criado o encodificador de dados. Code({Resultado.StatusCode.ToString()}) - Mensagem de erro > " + Resultado.ObterMensagem(Resultado.HResult));
                }

                //Cria os atributos para o escritor.
                myTranscodeApi.AtributosEscritor = new CarenMFAttributes(2);

                //Define os atributos.
                myTranscodeApi.AtributosEscritor.SetUINT32(GUIDs_MFAttributes_SinkWriter.MF_READWRITE_DISABLE_CONVERTERS, 0);                                                    //0 - HABILITA CONVERSOES.
                myTranscodeApi.AtributosEscritor.SetGUID(GUIDs_MFAttributes_SinkWriter.MF_TRANSCODE_CONTAINERTYPE, GUIDs_MFTranscodeContainerType.TranscodeContainerType_MPEG4); //Container.

                //Chama o método para criar o escritor com o encodificador inicializado.
                myTranscodeApi.Escritor = new CarenMFSinkWriter(myTranscodeApi.Encoder, myTranscodeApi.AtributosEscritor);

                //Define o tipo de mídia de entrada.
                Resultado = myTranscodeApi.Escritor.SetInputMediaType(0, myTranscodeApi.TypeInput, null);

                //Verifica se não houve erro.
                if (Resultado.StatusCode != ResultCode.SS_OK)
                {
                    //Ocorreu uma falha..

                    //Chama uma exceção.
                    throw new Exception($"Ocorreu uma falha ao definir o tipo de mídia de entrada. Code({Resultado.StatusCode.ToString()}) - Mensagem de erro > " + Resultado.ObterMensagem(Resultado.HResult));
                }
            }
            break;

            default:
                throw new Exception("Nenhum encodificador disponivel para o tipo de audio de saida escolhido.");
            }
        }
Exemple #3
0
 /// <summary>
 /// Gets the audio encoder with the specified short name.
 /// </summary>
 /// <param name="shortName">
 /// The name of the audio encoder.
 /// </param>
 /// <returns>
 /// The requested audio encoder.
 /// </returns>
 public static HBAudioEncoder GetAudioEncoder(string shortName)
 {
     return(AudioEncoders.SingleOrDefault(e => e.ShortName == shortName));
 }
Exemple #4
0
        bool supportedAudioEncodersFilter(Object audioEncoder)
        {
            AudioEncoders encoder = (AudioEncoders)audioEncoder;

            switch (ContainerFormat)
            {
            case ContainerFormats.MP4:
                if (encoder == AudioEncoders.libmp3lame ||
                    encoder == AudioEncoders.libvo_aacenc)
                {
                    return(true);
                }
                else
                {
                    return(false);
                }

            case ContainerFormats.MOV:
                if (encoder == AudioEncoders.libmp3lame ||
                    encoder == AudioEncoders.libvo_aacenc)
                {
                    return(true);
                }
                else
                {
                    return(false);
                }

            case ContainerFormats.AVI:
                if (encoder == AudioEncoders.libmp3lame)
                {
                    return(true);
                }
                else
                {
                    return(false);
                }

            case ContainerFormats.MKV:
                if (encoder == AudioEncoders.libmp3lame ||
                    encoder == AudioEncoders.libvo_aacenc ||
                    encoder == AudioEncoders.libvorbis ||
                    encoder == AudioEncoders.libopus)
                {
                    return(true);
                }
                else
                {
                    return(false);
                }

            case ContainerFormats.FLV:
                if (encoder == AudioEncoders.libmp3lame ||
                    encoder == AudioEncoders.libvo_aacenc)
                {
                    return(true);
                }
                else
                {
                    return(false);
                }

            case ContainerFormats.WMV:
                if (encoder == AudioEncoders.wmav2 ||
                    encoder == AudioEncoders.wmav1)
                {
                    return(true);
                }
                else
                {
                    return(false);
                }

            case ContainerFormats.WEBM:
                if (encoder == AudioEncoders.libvorbis ||
                    encoder == AudioEncoders.libopus)
                {
                    return(true);
                }
                else
                {
                    return(false);
                }

            case ContainerFormats.GIF:
                if (encoder == AudioEncoders.none)
                {
                    return(true);
                }
                else
                {
                    return(false);
                }

            case ContainerFormats.PNG:
                if (encoder == AudioEncoders.none)
                {
                    return(true);
                }
                else
                {
                    return(false);
                }

            case ContainerFormats.MP3:
                if (encoder == AudioEncoders.libmp3lame)
                {
                    return(true);
                }
                else
                {
                    return(false);
                }

            case ContainerFormats.M4A:
                if (encoder == AudioEncoders.libvo_aacenc)
                {
                    return(true);
                }
                else
                {
                    return(false);
                }

            case ContainerFormats.OGG:
                if (encoder == AudioEncoders.libvorbis ||
                    encoder == AudioEncoders.libopus)
                {
                    return(true);
                }
                else
                {
                    return(false);
                }

            case ContainerFormats.FLAC:
                if (encoder == AudioEncoders.flac)
                {
                    return(true);
                }
                else
                {
                    return(false);
                }

            default:
                return(false);
            }
        }