赞
踩
1、编译参数
在使用./configure编译ffmpeg库时,需要添加一些编译选项支持项目所需要的功能。具体参数如下:
- --enable-encoder=pcm_alaw --enable-decoder=pcm_alaw //支持PCM和G711编解码
- --enable-demuxer=mov //支持mov,mp4,m4a,3gp,3g2,mj2解复用
2、代码模块
ffmpeg本身是支持H264+AAC的mp4封装格式的,但是并不支持H264+G711的mp4封装格式。
ffmpeg中对MP4的打包处理是在movenc.c中,为了能够使ffmpeg支持H264+G711的mp4封装格式,同时也可以支持音频原始数据封装,修改libavformat/movenc.c代码以下部分:
- if (version == 2) {
- avio_wb16(pb, 3);
- avio_wb16(pb, 16);
- avio_wb16(pb, 0xfffe);
- avio_wb16(pb, 0);
- avio_wb32(pb, 0x00010000);
- avio_wb32(pb, 72);
- avio_wb64(pb, av_double2int(track->enc->sample_rate));
- avio_wb32(pb, track->enc->channels);
- avio_wb32(pb, 0x7F000000);
- avio_wb32(pb, av_get_bits_per_sample(track->enc->codec_id));
- avio_wb32(pb, mov_get_lpcm_flags(track->enc->codec_id));
- avio_wb32(pb, track->sample_size);
- avio_wb32(pb, get_samples_per_packet(track));
- } else {
- if (track->mode == MODE_MOV) {
- avio_wb16(pb, track->enc->channels);
- if (track->enc->codec_id == AV_CODEC_ID_PCM_U8 ||
- track->enc->codec_id == AV_CODEC_ID_PCM_S8)
- avio_wb16(pb, 8); /* bits per sample */
- else if (track->enc->codec_id == AV_CODEC_ID_ADPCM_G726)
- avio_wb16(pb, track->enc->bits_per_coded_sample);
- else
- avio_wb16(pb, 16);
- avio_wb16(pb, track->audio_vbr ? -2 : 0); /* compression ID */
- } else { /* reserved for mp4/3gp */
- avio_wb16(pb, track->enc->channels > 0 ?
- track->enc->channels : 1);
- track->enc->bits_per_coded_sample = av_get_bits_per_sample(track->enc->codec_id);
- avio_wb16(pb, track->enc->bits_per_coded_sample > 0 ?
- track->enc->bits_per_coded_sample : 16);
- avio_wb16(pb, 0);
- }
-
- avio_wb16(pb, 0); /* packet size (= 0) */
- avio_wb16(pb, track->enc->sample_rate <= UINT16_MAX ?
- track->enc->sample_rate : 0);
- avio_wb16(pb, 0); /* Reserved */
- }
- static int mov_find_codec_tag(AVFormatContext *s, MOVTrack *track)
- {
- int tag;
-
- if (track->mode == MODE_MP4 || track->mode == MODE_PSP)
- tag = mp4_get_codec_tag(s, track);
- else if (track->mode == MODE_ISM) {
- tag = mp4_get_codec_tag(s, track);
- if (!tag && track->enc->codec_id == AV_CODEC_ID_WMAPRO)
- tag = MKTAG('w', 'm', 'a', ' ');
- } else if (track->mode == MODE_IPOD)
- tag = ipod_get_codec_tag(s, track);
- else if (track->mode & MODE_3GP)
- tag = ff_codec_get_tag(codec_3gp_tags, track->enc->codec_id);
- else if (track->mode == MODE_F4V)
- tag = ff_codec_get_tag(codec_f4v_tags, track->enc->codec_id);
-
- if (tag == 0){
- tag = mov_get_codec_tag(s, track);
- }
- return tag;
- }
---------------------
作者:珠雨妮儿
来源:CSDN
原文:https://blog.csdn.net/zhuyunier/article/details/80814227
版权声明:本文为博主原创文章,转载请附上博文链接!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。