/// <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."); } }
/// <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)); }
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); } }