ffmpeg Pcm 转AAC Specified sample format s16 is invalid or not supported

Amber_0901 2016-07-14 10:54:03

PCM转AAC
报错如下:
Output #0, adts, to '/var/mobile/Containers/Data/Application/6BD36B53-E9BF-49BF-9BA3-8CEBD98D2233/Documents/TestAAC1.aac':
Stream #0:0: Audio: aac, 44100 Hz, stereo, s16, 64 kb/s
[aac @ 0x14c8a0400] The encoder 'aac' is experimental but experimental codecs are not enabled, add '-strict -2' if you want to use it.



查找问题说 pCodecCtx->strict_std_compliance =FF_COMPLIANCE_EXPERIMENTAL; 然后解决。出现下面的错误:
Output #0, adts, to '/var/mobile/Containers/Data/Application/4DF33CCF-C12B-4CB5-8D50-019204860CC7/Documents/TestAAC1.aac':
Stream #0:0: Audio: aac, 44100 Hz, stereo, s16, 64 kb/s
[aac @ 0x14e873200] Specified sample format s16 is invalid or not supported
Failed to open encoder!



Specified sample format s16 is invalid or not supported? 求解
...全文
3829 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
bing激凌~ 2018-03-13
  • 打赏
  • 举报
回复
http://blog.csdn.net/lichen18848950451/article/details/78265659
biguiyuan111 2017-12-20
  • 打赏
  • 举报
回复
这个打印是从avcodec_open2里打印出来的,看源码就知道sample_fmt不支持AV_SAMPLE_FMT_S16,至于支持哪一种?可以参考avcodec_open2,打印出pCodec->sample_fmts就知道了
Why???????? 2017-04-27
  • 打赏
  • 举报
回复
楼主这个问题最后是怎么解决的呢,能分享一下吗
网易云捕 2016-07-14
  • 打赏
  • 举报
回复
引用 1 楼 crash163 的回复:
按照理解:sample_fmt 不是(或不支持) AV_SAMPLE_FMT_S16 格式,你换种? 比如:AV_SAMPLE_FMT_FLTP 。。
所有的格式: https://www.ffmpeg.org/doxygen/2.0/samplefmt_8h.html enum AVSampleFormat { AV_SAMPLE_FMT_NONE = -1, AV_SAMPLE_FMT_U8, AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_DBL, AV_SAMPLE_FMT_U8P, AV_SAMPLE_FMT_S16P, AV_SAMPLE_FMT_S32P, AV_SAMPLE_FMT_FLTP, AV_SAMPLE_FMT_DBLP, AV_SAMPLE_FMT_NB } 或者试下:AV_SAMPLE_FMT_S16P ?
网易云捕 2016-07-14
  • 打赏
  • 举报
回复
按照理解:sample_fmt 不是(或不支持) AV_SAMPLE_FMT_S16 格式,你换种? 比如:AV_SAMPLE_FMT_FLTP 。。
Amber_0901 2016-07-14
  • 打赏
  • 举报
回复
// // H264AAC.m // FFmpeg_X264_Codec // // Created by UIOT-Amber on 16/7/13. // Copyright © 2016年 suntongmian@163.com. All rights reserved. // #import "H264AAC.h" #ifdef __cplusplus extern "C" { #endif #include <libavutil/opt.h> #include <libavcodec/avcodec.h> #include <libavformat/avformat.h> #include <libswscale/swscale.h> #ifdef __cplusplus }; #endif @implementation H264AAC int flush_encoder(AVFormatContext *fmt_ctx,unsigned int stream_index){ int ret; int got_frame; AVPacket enc_pkt; if (!(fmt_ctx->streams[stream_index]->codec->codec->capabilities & CODEC_CAP_DELAY)) return 0; while (1) { enc_pkt.data = NULL; enc_pkt.size = 0; av_init_packet(&enc_pkt); ret = avcodec_encode_audio2 (fmt_ctx->streams[stream_index]->codec, &enc_pkt, NULL, &got_frame); av_frame_free(NULL); if (ret < 0) break; if (!got_frame){ ret=0; break; } printf("Flush Encoder: Succeed to encode 1 frame!\tsize:%5d\n",enc_pkt.size); /* mux encoded frame */ ret = av_write_frame(fmt_ctx, &enc_pkt); if (ret < 0) break; } return ret; } - (int)doSomeThings{ AVFormatContext* pFormatCtx; AVOutputFormat* fmt; AVStream* audio_st; AVCodecContext* pCodecCtx; AVCodec* pCodec; uint8_t* frame_buf; AVFrame* pFrame; AVPacket pkt; int got_frame=0; int ret=0; int size=0; FILE *in_file=NULL; //Raw PCM data int framenum=1000; //Audio frame number NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask,YES); NSString *documentsDirectory = [paths objectAtIndex:0]; NSString *writablePath = [documentsDirectory stringByAppendingPathComponent:@"TestAAC1.aac"]; // const char *out_filename = "cuc_ieschool.mp4";//Output file URL const char *out_file = [writablePath UTF8String]; //Output URL int i; NSString *aacStr = [[NSBundle mainBundle] pathForResource:@"PlayerPCM" ofType:@"pcm"]; const char* aac_file = [aacStr UTF8String]; //Output URL in_file= fopen(aac_file, "rb"); av_register_all(); //Method 1. pFormatCtx = avformat_alloc_context(); fmt = av_guess_format(NULL, out_file, NULL); pFormatCtx->oformat = fmt; //Method 2. //avformat_alloc_output_context2(&pFormatCtx, NULL, NULL, out_file); //fmt = pFormatCtx->oformat; //Open output URL if (avio_open(&pFormatCtx->pb,out_file, AVIO_FLAG_READ_WRITE) < 0){ printf("Failed to open output file!\n"); return -1; } audio_st = avformat_new_stream(pFormatCtx, 0); if (audio_st==NULL){ return -1; } pCodecCtx = audio_st->codec; pCodecCtx->codec_id = fmt->audio_codec; pCodecCtx->codec_type = AVMEDIA_TYPE_AUDIO; pCodecCtx->sample_fmt = AV_SAMPLE_FMT_S16P; pCodecCtx->sample_rate= 8000; pCodecCtx->channel_layout=AV_CH_LAYOUT_STEREO; pCodecCtx->channels = 1;//av_get_channel_layout_nb_channels(pCodecCtx->channel_layout); pCodecCtx->bit_rate = 16; pCodecCtx->strict_std_compliance =FF_COMPLIANCE_EXPERIMENTAL; //Show some information av_dump_format(pFormatCtx, 0, out_file, 1); pCodec = avcodec_find_encoder(pCodecCtx->codec_id); if (!pCodec){ printf("Can not find encoder!\n"); return -1; } if (avcodec_open2(pCodecCtx, pCodec,NULL) < 0){ printf("Failed to open encoder!\n"); return -1; } pFrame = av_frame_alloc(); pFrame->nb_samples= pCodecCtx->frame_size; pFrame->format= pCodecCtx->sample_fmt; size = av_samples_get_buffer_size(NULL, pCodecCtx->channels,pCodecCtx->frame_size,pCodecCtx->sample_fmt, 1); frame_buf = (uint8_t *)av_malloc(size); avcodec_fill_audio_frame(pFrame, pCodecCtx->channels, pCodecCtx->sample_fmt,(const uint8_t*)frame_buf, size, 1); //Write Header avformat_write_header(pFormatCtx,NULL); av_new_packet(&pkt,size); for (i=0; i<framenum; i++){ //Read PCM if (fread(frame_buf, 1, size, in_file) <= 0){ printf("Failed to read raw data! \n"); return -1; }else if(feof(in_file)){ break; } pFrame->data[0] = frame_buf; //PCM Data pFrame->pts=i*100; got_frame=0; //Encode ret = avcodec_encode_audio2(pCodecCtx, &pkt,pFrame, &got_frame); if(ret < 0){ printf("Failed to encode!\n"); return -1; } if (got_frame==1){ printf("Succeed to encode 1 frame! \tsize:%5d\n",pkt.size); pkt.stream_index = audio_st->index; ret = av_write_frame(pFormatCtx, &pkt); av_free_packet(&pkt); } } //Flush Encoder ret = flush_encoder(pFormatCtx,0); if (ret < 0) { printf("Flushing encoder failed\n"); return -1; } //Write Trailer av_write_trailer(pFormatCtx); //Clean if (audio_st){ avcodec_close(audio_st->codec); av_free(pFrame); av_free(frame_buf); } avio_close(pFormatCtx->pb); avformat_free_context(pFormatCtx); fclose(in_file); return 0; } @end
Amber_0901 2016-07-14
  • 打赏
  • 举报
回复
引用 1 楼 crash163 的回复:
按照理解:sample_fmt 不是(或不支持) AV_SAMPLE_FMT_S16 格式,你换种? 比如:AV_SAMPLE_FMT_FLTP 。。
修改了 ,还是报错! 你用过Ffmpeg 将PCM转AAC吗?
Amber_0901 2016-07-14
  • 打赏
  • 举报
回复
这个没用,不过还是谢谢 Output #0, adts, to '/var/mobile/Containers/Data/Application/B956CB26-C09A-406B-A7B8-0C389BDD8F1B/Documents/TestAAC1.aac': Stream #0:0: Audio: aac, 8000 Hz, 1 channels (FL+FR), s16p, 0 kb/s [aac @ 0x13480ca00] Specified sample format s16p is invalid or not supported Failed to open encoder! 你用过Ffmpeg 将PCM转AAC吗?

29,027

社区成员

发帖
与我相关
我的任务
社区描述
主要讨论与iOS相关的软件和技术
社区管理员
  • iOS
  • 大熊猫侯佩
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧