iOS ffmpeg将音视频写入文件aac+h264

这段代码展示了如何在iOS应用中使用ffmpeg库将音视频数据编码并写入AAC和H264格式的文件。通过调用`add_audio_stream`和`add_video_stream`函数创建音视频流,`open_audio`和`open_video`初始化编码器,`write_audio_frame`和`write_video_frame`写入音视频帧,最后`close_audio`和`close_video`关闭编码器。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#define STREAM_DURATION   5.0
#define STREAM_FRAME_RATE 25 /* 25 images/s */
#define STREAM_NB_FRAMES  ((int)(STREAM_DURATION * STREAM_FRAME_RATE))
#define STREAM_PIX_FMT PIX_FMT_YUV420P /* default pix_fmt */

#undef NO_DATA
#define NO_DATA  0
#define HAS_DATA 1


#define STREAM_DURATION   5.0
#define STREAM_FRAME_RATE 25 /* 25 images/s */
#define STREAM_NB_FRAMES  ((int)(STREAM_DURATION * STREAM_FRAME_RATE))
#define STREAM_PIX_FMT PIX_FMT_YUV420P /* default pix_fmt */

float t, tincr, tincr2;
int16_t *samples;
uint8_t *audio_outbuf;
int audio_outbuf_size;
int audio_input_frame_size;

AVFormatContext *oc;
AVStream *audio_st0, *video_st0;

static AVStream *add_audio_stream(AVFormatContext *oc, int codec_id)
{
    AVCodecContext *c;
    AVStream *st;
    

    ///////////////////////////////////////////////
    AVCodec *codec;
    codec = avcodec_find_encoder(AV_CODEC_ID_AAC);
    
    if(NULL == codec)
    {
        printf("没有找到合适的编码器!\n");
    }

    st = avformat_new_stream(oc, codec);
    
    if (st==NULL)
    {
        printf("输出文件打开失败!\n");
    }
    
    c = st->codec;
    c->codec = codec;
    c->codec_id =  AV_CODEC_ID_AAC;
    c->codec_type = AVMEDIA_TYPE_AUDIO;
    c->sample_fmt = AV_SAMPLE_FMT_S16;
    c->sample_rate= 44100;
    c->channel_layout=AV_CH_LAYOUT_STEREO;
    c->channels = /*av_get_channel_layout_nb_channels(audioCodecCtx->channel_layout)*/2;
    c->bit_rate = 16000;
    c->strict_std_compliance = FF_COMPLIANCE_EXPERIMENTAL;

    codec->profiles = FF_PROFILE_AAC_MAIN;
    int a[]= {AV_SAMPLE_FMT_S16};
    codec->sample_fmts = a;

    return st;
}

static void make_dsi( unsigned int sampling_frequency_index, unsigned int channel_configuration,  char* dsi )
{
    unsigned int object_type = 2; // AAC LC by default
    dsi[0] = (object_type<<3) | (sampling_frequency_index>>1);
    dsi[1] = ((sampling_frequency_index&1)<<7) | (channel_configuration<<3);
}


static int get_sr_index(unsigned int sampling_frequency)
{
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值