Solicite el código de compresión de audio ffmpeg (wav comprimido en wma)
Esto es sencillo.
La idea general es
1. Abrir el archivo wav
2. Abrir el archivo wma para generar
3. Leer el marco de datos continuamente
4. Después de leer, decodificar y escribir en wma
5. Cierra el archivo wav
6. Es problemático reescribir el ejemplo. Publique algún código
#include "Debug.h"
#include "FFMpegAVFileReader.h"
#include "FFMpegAVFileReaderFactory.h"
#include lt;sstreamgt;
#include "yk_convert.h"
carácter estático h264_head[4] = {(char)0x00, (char) 0x00, (char )0x00, (char)0x01};
espacio de nombres YK
{
FFMpegAVFileReader::FFMpegAVFileReader()
{
ffmpeg_avcodec_init();
ffmpeg_av_register_all();
av_log_set_callback(ffmpeg_log_callback
m_format_context = 0;
m_input_format = 0;
m_format_parameters = 0;
m_packet = (AVPacket*)av_mallocz(sizeof(AVPacket)); >
FFMpegAVFileReader::~FFMpegAVFileReader()
{
Cerrar()
av_free(m_packet
}
avfile_reader_param_t* FFMpegAVFileReader::GetParam()
{
//YK::AutoLock l(m_lock);
amplificador de retorno ;m_param;
}
void FFMpegAVFileReader::Seek(int pts)
{
YK::AutoLock l(m_lock) ;
int ret = av_seek_frame(m_format_context, -1, (YK::int64_t)pts * (YK::int64_t)1000, AVSEEK_FLAG_BACKWARD | AVSEEK_FLAG_ANY); ret gt; = 0)
//{
// para(int i = 0; i lt; m_format_context-gt; nb_streams; i )
// {
// avcodec_flush_buffers( m_format_context-gt; transmisiones[i]-gt; c
odec );
// }
//}
//std::stringstream ss;
//ss lt; lt; "pts = " lt; lt; pts
// lt; lt; " ret = " lt; ret lt; lt; /OutputDebugString(ss.str().data());
}
void FFMpegAVFileReader::GetDuration(doubleamp; inicio, doubleamp; final)
{
//YK:: AutoLock l(m_lock);
inicio = (doble)(m_start_time / 1000000
fin = inicio (doble) (m_duration / 1000000);
}
service_error_t FFMpegAVFileReader::Open(int time_out)
{
YK::AutoLock l (m_lock);
service_error_t service_error;
// Abrir archivo
if (av_open_input_file(amp; m_format_context, TToANSI(m_param.input_file_path).data() , m_input_format, 0, m_format_parameters) lt; 0)
{
service_error.init(service_error_type_failed, "av_open_input_file falló"
return service_error; p> p>
}
// Consultar información de flujo
if(av_find_stream_info(m_format_context) lt; 0)
{
service_error.init(service_error_type_failed, "av_find_stream_info falló");
return service_error
}
m_start_time = m_format_context-gt; >
m_duration = m_format_context-gt;duration;
#ifdef _DEBUG
pFile = fopen("D:/1.out","w b");
#endif
// Guardar información de la transmisión
av_stream_info_t av_stream_info;
for(unsigned int i = 0; i lt; m_format_context-gt; nb_streams;
)
{
AVStream *st = m_format_context-gt; transmisiones[i];
AVCodecContext *enc = st-gt;
if(enc-gt; codec_type == AVMEDIA_TYPE_AUDIO)
{
// Audio
av_stream_info.av_stream_info_type = av_stream_info_type_audio;
av_stream_info.codec_id = codec_id_none;
//channel_layout = enc-gt;channel_layout;
av_stream_info.audio_channels = enc-gt;canales;
av_stream_info .audio_samplepersec = enc-gt;sample_rate;
av_stream_info.audio_bitpersample = yk_sample_format(enc-gt;sample_fmt);
//audio_sample_fmt = enc-gt;sample_fmt;
//input_codecs[nb_icodecs] = avcodec_find_decoder_by_name(audio_codec_name);
av_stream_info.codec_id = yk_code_id(enc-gt;codec_id);
av_stream_info.extradata_size = enc-gt; extradata_size;
if(av_stream_info.extradata_size)
memcpy(av_stream_info.extradata, enc-gt; extradata, enc-gt; extradata_size
if( av_stream_info.codec_id == codec_id_mp3)
{
av_stream_info.extradata_size = sizeof(mpeg1_waveformat_extradata);
mpeg1_waveformat_extradata* pMpeg1WaveFormat = (mpeg1_waveformat_extradata*)av_stream_info.extradata;
pMpeg1WaveFormat-gt; dwPTSHigh = 0
pMpeg1WaveFormat-gt; /pag
>
pMpeg1WaveFormat-gt; fwHeadFlags = 25
pMpeg1WaveFormat-gt; -gt; fwHeadModeExt = 1;
pMpeg1WaveFormat-gt; wHeadEmphasis = 1;
}
AddStreamInfo(av_stream_info); = i;
}
else if(enc-gt;codec_type == AVMEDIA_TYPE_VIDEO)
{
// vídeo p>
av_stream_info.av_stream_info_type = av_stream_info_type_video;
av_stream_info.codec_id = codec_id_none;
av_stream_info.video_width = enc-gt;width;
av_stream_info. video_height = enc-gt;height;
av_stream_info.video_profile = enc-gt;profile;
av_stream_info.video_level = enc-gt;level;
si (av_stream_info.video_profile lt; 0)
{
av_stream_info.video_profile = 77
}
if(av_stream_info.video_level lt; ; 0)
{
av_stream_info.video_level = 30
}
av_stream_info.extradata_size =