LINUX.ORG.RU

FFmpeg работа с аудио


0

1

Переписываю один видео файл в другой. Сначала разобралась с видео, сейчас пытаюсь переписать аудио. После создания в новом файле аудио потока, прога стала вылетать на av_interleaved_write_frame(). С аудио ничего не делаю, просто создаю новий стрим, а в конце закрываю. В чем может быть проблема?


Ответ на: комментарий от bk_

Код взят з семплов ffmpeg:

            avcodec_register_all() ;	
	av_register_all();

	avformat_alloc_output_context2(&pOutFormactx, NULL, NULL, filename);
	
	snprintf(pOutFormactx->filename, sizeof(pOutFormactx->filename), "%s", filename);
	


	pVideoSt = av_new_stream(pOutFormactx, 0);
	
	if(!pVideoSt)
	{
		LOGI(1, "Could not alloc stream\n");
		exit(1);
	}
		
	// Set encoding options
	pOutCodecCtx = pVideoSt->codec;
	pOutCodecCtx->codec_id =  pCodecCtx->codec_id;
	pOutCodecCtx->codec_type =  pCodecCtx->codec_type;
	pOutCodecCtx->bit_rate =   pCodecCtx->bit_rate;
	pOutCodecCtx->width =  video_width_out;
	pOutCodecCtx->height =  video_height_out;
	pOutCodecCtx->time_base.den =  pCodecCtx->time_base.den;
	pOutCodecCtx->time_base.num = pCodecCtx->time_base.num;
	pOutCodecCtx->gop_size = pCodecCtx->gop_size;
	pOutCodecCtx->pix_fmt = pCodecCtx->pix_fmt;//PIX_FMT_YUV420P;
	pOutCodecCtx->thread_count = 4;
		   
	if(pOutFormactx->oformat->flags & AVFMT_GLOBALHEADER)
		pOutCodecCtx->flags |= CODEC_FLAG_GLOBAL_HEADER;//add_video_stream();

	//add audio stream
	AVCodecContext *c;
	pAudioSt = av_new_stream(pOutFormactx, 1);
	if (!pAudioSt)
	{
			LOGI(1, "Could not alloc stream\n");
			exit(1);
	}
	c = avcodec_alloc_context();
	c = pAudioSt->codec;
	
	c->codec_id = p_aCodecCtx->codec_id;
	c->codec_type = p_aCodecCtx->codec_type; //AVMEDIA_TYPE_AUDIO;
	c->sample_fmt = p_aCodecCtx->sample_fmt;
	c->bit_rate = p_aCodecCtx->bit_rate;	//audio_bit_rate;
	c->sample_rate = p_aCodecCtx->bit_rate;	//audio_sample_rate;
	c->channels = p_aCodecCtx->channels;	//audio_channels;
	c->profile = p_aCodecCtx->profile;		//FF_PROFILE_AAC_LOW;

	if (pOutFormactx->oformat->flags & AVFMT_GLOBALHEADER)
		c->flags |= CODEC_FLAG_GLOBAL_HEADER;

	av_dump_format(pOutFormactx, 0, filename, 1);

	// Find the encoder for the video stream
	OpenVideo();
	
	if ( avio_open(&pOutFormactx->pb, filename, AVIO_FLAG_WRITE) < 0)
	{
		LOGI(1, "CreateOutFile::Cann't create file %s", filename);
		exit(1);
	}
	av_write_header(pOutFormactx);

//-------------------------------------------------------------------
void SaveVideoFrame()
{
	if(!pVideoSt) 
	{
		LOGI(1,"SetVideoFrame::tried to Supply Video Frame when no video stream was present\n");
		return;
	}

	AVCodecContext *c = pVideoSt->codec;
	int out_size = avcodec_encode_video(pOutCodecCtx, video_outbuf, video_outbuf_size, pFrameOut);
	LOGI(1,"SetVideoFrame::avcodec_encode_video returned %d\n", out_size);

	if(out_size > 0)
	{	
		static AVPacket pkt;
		av_init_packet(&pkt);
		
		if (pOutCodecCtx->coded_frame->pts != AV_NOPTS_VALUE)
			pkt.pts = av_rescale_q(c->coded_frame->pts, c->time_base, pVideoSt->time_base);
		
		if(pOutCodecCtx->coded_frame->key_frame)
			pkt.flags |= AV_PKT_FLAG_KEY;
		

		pkt.stream_index = pVideoSt->index;
		pkt.data = video_outbuf;
		pkt.size = out_size;
		//здесь падает, если закоментировать создание аудио стрима все работеет
		if(av_interleaved_write_frame(pOutFormactx, &pkt) != 0)
		{
			LOGI(1,"SetVideoFrame::Unable to write video frame\n");
			return;
		}
		

	}
	else
	{
		LOGI(1,"SetVideoFrame::Unable to write video frame out_size < 0");
	}
}

Knopka
() автор топика
Ответ на: комментарий от Knopka

Аудио-кодек не открыт.

Используй ffmpeg с отладочной информацией, при падении стек вызовов сразу покажет причину. И к вопросам с падениями всегда и везде прикладывай backtrace.

fopen ★★
()
Ответ на: комментарий от Knopka

А лучше замени av_interleaved_write_frame на av_write_frame. И падать перестанет и interleaved_write все равно не будет работать, если ей не давать все заявленные потоки. Почувствуй разницу между av_interleaved_write_frame на av_write_frame.

fopen ★★
()
Ответ на: комментарий от fopen

Програма запускается на андроиде. Чисто теоретически прикрутить отладчик можно, но практически понятие не имею как.
При попытке открить енкодера acc его просто не находит, з декодером проблем нету. Чем можна заменить даный кодек?

Knopka
() автор топика
Ответ на: комментарий от Knopka

При попытке открить енкодера acc его просто не находит, з декодером проблем нету. Чем можна заменить даный кодек?

Замени его на aac :)

fopen ★★
()
Ответ на: комментарий от Knopka
	c = avcodec_alloc_context();
	c = pAudioSt->codec;

Андроиды потеют, отладчиком кода пользуются дилетанты, отладчиком и профилировщиком памяти - трусы, а (страшно сказать) статическим анализатором - зануды, а... кто-то пришел... OOM killer... ухожу-ухожу... я «не нужен»

fopen ★★
()
Ответ на: комментарий от fopen

с acc была очепятка...aac требует внешней либы, тип лецинзии которой не подходит.

Knopka
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.