博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ffmpeg AVFrame 插入静音帧
阅读量:4080 次
发布时间:2019-05-25

本文共 2272 字,大约阅读时间需要 7 分钟。

int frame_size_out_encode = out_fmt_ctx->streams[out_stream->index]->codec->frame_size;			if(!frame_size_out_encode)				frame_size_out_encode = put_into_fifo->nb_samples;

确定采样长度,先取得编码器frame_size,如果该值是0,比如pcm,则用输入Frame的nb_samples 作为采样长度。

AVCodecContext *acout = out_fmt_ctx->streams[0]->codec;	                        AVFrame *frame_fifo;  			frame_fifo = av_frame_alloc();			frame_fifo->nb_samples     = frame_size_out_encode;			frame_fifo->channel_layout = acout->channel_layout;  			frame_fifo->channels = av_get_channel_layout_nb_channels(frame_fifo->channel_layout);			frame_fifo->format         = acout->sample_fmt;  			frame_fifo->sample_rate    = acout->sample_rate;  			av_frame_get_buffer(frame_fifo, 0);			av_samples_set_silence(frame_fifo->data, 0, frame_fifo->nb_samples, frame_fifo->channels, (AVSampleFormat)frame_fifo->format);

按channels,format等参数申请缓存

av_init_packet(&pkt_out);					int ret = avcodec_encode_audio2(out_fmt_ctx->streams[0]->codec, &pkt_out, frame_fifo, &got_picture);					if (got_picture ) 					{						pkt_out.stream_index = out_stream->index;						pkt_out.dts = av_rescale_q_rnd(pkt_out.dts,							out_fmt_ctx->streams[out_stream->index]->codec->time_base,							out_fmt_ctx->streams[out_stream->index]->time_base,							(AVRounding)(AV_ROUND_NEAR_INF|AV_ROUND_PASS_MINMAX));						pkt_out.pts = av_rescale_q_rnd(pkt_out.pts,							out_fmt_ctx->streams[out_stream->index]->codec->time_base,							out_fmt_ctx->streams[out_stream->index]->time_base,							(AVRounding)(AV_ROUND_NEAR_INF|AV_ROUND_PASS_MINMAX));						pkt_out.duration = av_rescale_q(pkt_out.duration,							out_fmt_ctx->streams[out_stream->index]->codec->time_base,							out_fmt_ctx->streams[out_stream->index]->time_base);						 						av_log(NULL, AV_LOG_DEBUG, "Muxing frame\n");						/* mux encoded frame */						ret = av_interleaved_write_frame(out_fmt_ctx, &pkt_out);						av_free_packet(&pkt_out);						if (ret < 0)						{							printf("write a null frame failed!\n");							break;						}						printf("success write a null frame:index %d\n", frame_index++);						duration_sum += frame_size_out_encode;						if(duration_sum * av_q2d(out_fmt_ctx->streams[out_stream->index]->codec->time_base) >= g_offset)							break;					}

编码,写入AVPacket,duration_sum记录总时长的信息,g_offset是静音时常

转载地址:http://gutni.baihongyu.com/

你可能感兴趣的文章
phpquery抓取网站内容简单介绍
查看>>
找工作准备的方向(4月22日写的)
查看>>
关于fwrite写入文件后打开查看是乱码的问题
查看>>
用结构体指针前必须要用malloc,不然会出现段错误
查看>>
Linux系统中的美
查看>>
一些实战项目(linux应用层编程,多线程编程,网络编程)
查看>>
我觉得专注于去学东西就好了,与世无争。
查看>>
原来k8s docker是用go语言写的,和现在所讲的go是一个东西!
查看>>
STM32CubeMX 真的不要太好用
查看>>
STM32CubeMX介绍、下载与安装
查看>>
电机和桨叶要搭配选择
查看>>
不要买铝合金机架的无人机,不耐摔,易变形弯曲。
查看>>
ACfly也是基于FreeRTOS的
查看>>
F330装GPS的位置
查看>>
我想先用三个或者五个激光测距做无人机的室内定位和避障
查看>>
pixhawk也可以用Airsim仿真
查看>>
《无人机电机与电调技术》可以看看
查看>>
我发现七月在线的GAAS课程基本都讲到了
查看>>
电机堵转
查看>>
一个真正好的无人机应该是需要自己慢慢去调参的,别人的默认参数是可以飞但是可能达不到perfect的效果。
查看>>