当前位置: 首页 > news >正文

国外最好的免费建站免费图文模板

国外最好的免费建站,免费图文模板,图书馆网站制作,推广方法和技巧1.简介 这里引入FFmpeg库#xff0c;获取音频流数据#xff0c;然后通过FFmpeg将视频流解码成pcm原始数据#xff0c;再将pcm数据送入到SDL库中实现音频播放。 2.FFmpeg的操作流程 注册API#xff1a;av_register_all()构建输入AVFormatContext上下文#xff1a;avform…1.简介 这里引入FFmpeg库获取音频流数据然后通过FFmpeg将视频流解码成pcm原始数据再将pcm数据送入到SDL库中实现音频播放。 2.FFmpeg的操作流程 注册APIav_register_all()构建输入AVFormatContext上下文avformat_open_input()查找音视频流信息avformat_find_stream_info()查找解码器avcodec_find_decoder()打开解码器avcodec_open2()然后通过while循环不停的读取数据av_read_frame()帧解码avcodec_send_packet()和avcodec_receive_frame()重采样swr_convert() 3.SDL音频播放流程 SDL播放音频的流程如下 初始化音频子系统SDL_Init()。设置音频参数SDL_AudioSpec。设置回调函数SDL_AudioCallback。打开音频设备SDL_OpenAudio()。打开pcm文件读取数据。开始播放SDL_PauseAudio()。 4.示例 #include stdio.h #include SDL.h #include memoryextern C { #include libavcodec/avcodec.h #include libavformat/avformat.h #include libswscale/swscale.h #include libavutil/imgutils.h #include libswresample/swresample.h };static Uint8 *audio_chunk; static Uint32 audio_len; static Uint8 *audio_pos;void fill_audio(void *udata, Uint8 *stream, int len) {//SDL 2.0SDL_memset(stream, 0, len);if (audio_len 0) /* Only play if we have data left */return;len (len audio_len ? audio_len : len); /* Mix as much data as possible */SDL_MixAudio(stream, audio_pos, len, SDL_MIX_MAXVOLUME/2);audio_pos len;audio_len - len; }AVFrame *recv(AVCodecContext *codecCtx) {if (!codecCtx){return NULL;}AVFrame *frame av_frame_alloc();int ret avcodec_receive_frame(codecCtx, frame);if (ret AVERROR(EAGAIN) || ret AVERROR_EOF){av_frame_free(frame);return NULL;}else if (ret 0){av_frame_free(frame);return NULL;}return frame; }#undef main int main(int argc, char* argv[]) {av_register_all();///ffmpegavformat_network_init();AVFormatContext* pFormatCtx NULL;const char* inputUrl ./2.mp4;///打开输入的流int ret avformat_open_input(pFormatCtx, inputUrl, NULL, NULL);if (ret ! 0){printf(Couldnt open input stream.\n);return -1;}//查找流信息if (avformat_find_stream_info(pFormatCtx, NULL) 0){printf(Couldnt find stream information.\n);return -1;}//找到音频流索引int audio_index av_find_best_stream(pFormatCtx, AVMEDIA_TYPE_AUDIO, -1, -1, NULL, 0);AVStream* st pFormatCtx-streams[audio_index];AVCodec* codec nullptr;//找到解码器codec avcodec_find_decoder(st-codecpar-codec_id);if (!codec){fprintf(stderr, Codec not found\n);return -1;}//申请AVCodecContextAVCodecContext* pCodecCtx avcodec_alloc_context3(codec);if (!pCodecCtx){return -1;}avcodec_parameters_to_context(pCodecCtx, pFormatCtx-streams[audio_index]-codecpar);//打开解码器if ((ret avcodec_open2(pCodecCtx, codec, NULL) 0)){return -1;}AVPacket* pkt av_packet_alloc();//------------SDL----------------//Output Info-----------------------------printf(---------------- File Information ---------------\n);av_dump_format(pFormatCtx, 0, inputUrl, 0);printf(-------------------------------------------------\n);SwrContext *swrContext swr_alloc();if (!swrContext){return -1;}swrContext swr_alloc_set_opts(NULL, //ctxAV_CH_LAYOUT_STEREO, //输出channel布局AV_SAMPLE_FMT_S16, //输出的采样格式44100, //采样率av_get_default_channel_layout(pCodecCtx-channels), //输入channel布局pCodecCtx-sample_fmt, //输入的采样格式pCodecCtx-sample_rate, //输入的采样率0, NULL);// 初始化重采样上下文if (swr_init(swrContext) 0){swr_free(swrContext);return -1;}if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER)){printf(Could not initialize SDL - %s\n, SDL_GetError());return -1;}//SDL_AudioSpecSDL_AudioSpec wanted_spec;wanted_spec.freq 44100;wanted_spec.format AUDIO_S16SYS;wanted_spec.channels 2;wanted_spec.silence 0;wanted_spec.samples 1024;wanted_spec.callback fill_audio;wanted_spec.userdata pCodecCtx;if (SDL_OpenAudio(wanted_spec, NULL) 0){printf(cant open audio.\n);return -1;}//PlaySDL_PauseAudio(0);// 分配输出音频数据uint8_t *out_buffer nullptr;while (av_read_frame(pFormatCtx, pkt) 0){if (pkt-stream_index audio_index){//一次send 多次recvint ret avcodec_send_packet(pCodecCtx, pkt);if (ret 0)continue;//释放资源av_packet_unref(pkt);while (1){AVFrame *frame recv(pCodecCtx);if (!frame)break;//输入的样本数int in_nb_samples frame-nb_samples;//1024int out_linesize;int dst_nb_samples av_rescale_rnd(in_nb_samples, 44100, frame-sample_rate, AV_ROUND_UP);//输出的样本数int out_buffer_size av_samples_get_buffer_size(NULL, 2, dst_nb_samples, AV_SAMPLE_FMT_S16, 0);if(!out_buffer)out_buffer (uint8_t *)av_malloc(out_buffer_size);//返回每个通道输出的样本数错误时为负值int sampleCount swr_convert(swrContext, out_buffer, dst_nb_samples,(const uint8_t**)frame-data, in_nb_samples);if (sampleCount 0){av_frame_free(frame);break;}int outSize sampleCount * 2 * av_get_bytes_per_sample(AV_SAMPLE_FMT_S16);while (audio_len 0)//Wait until finishSDL_Delay(1);//Set audio buffer (PCM data)audio_chunk (Uint8 *)out_buffer;//Audio buffer lengthaudio_len outSize;audio_pos audio_chunk;av_frame_free(frame);}}else{//释放资源av_packet_unref(pkt);}}//--------------av_free(out_buffer);av_packet_free(pkt);swr_close(swrContext);swr_free(swrContext);avcodec_close(pCodecCtx);avcodec_free_context(pCodecCtx);avformat_close_input(pFormatCtx);SDL_CloseAudio();SDL_Quit(); }5.相关推荐 [总结]FFMPEG视音频编解码零基础学习方法_零基础ffmpeg 雷霄骅-CSDN博客  FFmpeg 音频解码秒懂-CSDN博客 SDL2 播放音频数据(PCM)-CSDN博客 SDL2 消息循环和事件响应-CSDN博客  SDL2 播放视频文件(MP4)-CSDN博客
http://www.w-s-a.com/news/875387/

相关文章:

  • 班级网站做哪些方面wordpress标签 扩展
  • 如何在电商上购物网站Wordpress 域名授权插件
  • 网站建设后台怎么弄昆明如何做好关键词推广
  • 自己怎么做个网站优酷视频网站开发
  • 2015做网站前景电子商务营销的发展现状
  • 官方网站建设情况说明电子商务网站开发的形式有
  • 网站建设玖金手指排名11专业建站公司建站系统
  • 全球排名前十网站百度网站官网网址
  • 商家在携程旅游网站怎样做宣传做网站公司苏州
  • 芜湖做网站都有哪些广州音乐制作公司
  • 青岛好的网站制作推广注册公司流程步骤
  • 怎么制作营销网站模板wordpress苗木模板
  • 手机网站样例wordpress 排序
  • 济南网站建设手机网站开发人员需要去做原型吗
  • 动易网站模板下载微信支付 wordpress
  • 学校建设外文网站情况阿里云 建设网站怎么样
  • 网站建设与网页设计制作深圳网站建设首选上榜网络
  • 网站浏览成交指标计算机应用是做什么的
  • 企业网站建设的要求wordpress 404页面模板
  • 公司怎么注册官方网站wordpress花园网站
  • 一般网站的建设步骤有哪些企业网站建设应该注意什么事项问题
  • 枣庄市建设局网站建设工程合同交底的内容包括
  • 全国十大跨境电商排名seo优化入门教程
  • 福安网站开发网站内容建设要求age06
  • 网站开发制作公司罗湖在线
  • 做网站银川潍坊网络科技有限公司
  • 南宁企业网站建站模板盐田高端网站建设
  • 深圳市建设局网站张局北京档案馆网站建设
  • 运动健身型网站开发网站备案掉了什么原因
  • 网站开发的前后端是什么注册网站多少钱一年