Charly LEE Ответов: 1

Декодирования звука шума на iOS, но на Windows


the input mp3 is single channel with 32000 sample rate, 16bit signed.


Я использую ffmpeg 2.6 для декодирования mp3 на iOS9.3.2 pad. Он получает только белый шум. но он работает на windows.Я записываю декодированный PCM в файл и использовать инструмент, чтобы играть. когда я изменил бит, установленный на 32. Я слышу оригинальный звук с шумом в фоновом режиме и более высокой скоростью воспроизведения. если установить значение 8 бит или 16 бит, то можно услышать только белый шум.

Когда я обновляю ffmpeg до 3.1.1, декодирование не удалось из-за несогласованной конфигурации канала. Я действительно был озадачен, как это могло случиться. Я еще не установил ни одного параметра канала, да это и не нужно.


пожалуйста, помогите мне.

Что я уже пробовал:

У меня есть сравнение входного кадра MP3 и PCM вывод на обе системы.
вход такой же , как я читаю mp3-кадр из mp3-файла, но получаю совершенно другой выход. код, как показано ниже.

int FfmpegAudioDecoder::InitDecoderFFMpeg()
{
																	 
	codec_ = avcodec_find_decoder((AVCodecID)param_->codec_id);

	if (!codec_)
	{
		failed_ = true;
		av_log(0, log_level_, "Unsupported codec!");
		return -1;
	}

	codec_ctx_ = avcodec_alloc_context3(codec_);

	if (avcodec_open2(codec_ctx_, codec_, 0)  < 0)
	{
		failed_ = true;
		return -1;
	}

	if (!decoded_frame_) {
		if (!(decoded_frame_ = av_frame_alloc())) {
			av_log(0, log_level_, "Could not allocate audio frame\n");
			return -1;
		}
	}
}

<pre>int FfmpegAudioDecoder::DecodeAudio(const WktData * encode_packet , WktData* pcm_packet)
{
	int len = 0;
	int pkt_size = 0;
	unsigned char * pkt_data = 0;

	AVPacket avpkt;
	avpkt.data = encode_packet->data;
	avpkt.size = encode_packet->data_length;

	av_init_packet(&avpkt);

	int got_frame = 0;
	
	pkt_size = avpkt.size;
	pkt_data = avpkt.data;

	while (pkt_size > 0)
	{
		len = avcodec_decode_audio4(codec_ctx_, decoded_frame_, &got_frame, &avpkt);
		if (len < 0)
		{
			return -1;
		}

		/*if (EncodeAudio(decoded_frame) < 0)
			return -1;*/

	/*	int data_size = av_get_bytes_per_sample(codec_ctx_->sample_fmt);
		int i, ch;
		for (i = 0; i<decoded_frame_->nb_samples; i++)
			for (ch = 0; ch<codec_ctx_->channels; ch++)
				fwrite(decoded_frame_->data[ch] + data_size*i, 1, data_size, outfile);*/
		
		pkt_size -= len;
		pkt_data += len;
	}

	return 0;
}

1 Ответов

Рейтинг:
2

KarstenK

решение выглядит очень простым.

AVPacket avpkt;

av_init_packet(&avpkt);
// set values AFTER init
avpkt.data = encode_packet->data;
avpkt.size = encode_packet->data_length;


Я немного смущен тем, что ваш старый код работает в Windows. Но я знаю, что среда выполнения Objective-C инициализирует все значения в null, но в Windows ничего не происходит.

PS: начиная с iOS 9.3.3 вы можете декодировать H. 264 как HD-TV


Charly LEE

да, он хорошо работает на windows. что вы подразумеваете под "initailize all values to null" в коде? поскольку пакет encodeing - это определяемая пользователем структура, которая будет установлена для каждого вызова.