AVIO内存输入模式


目录

  1. 介绍
  2. 代码示例

1. 介绍

  1. AVIO内存输入模式是将内存区作输入输出,当启用内存IO模式后(即ifmt_ctx->pb有效时),将会忽略avformat_open_input()第二个参数url的值。
  2. 而对于其他一些场合,当有效音视频数据位于内存,而这片内存并无一个URL属性可用时,则只能使用内存IO模式来取得输入数据。

2. 代码示例

#include <stdio.h>
#include <stdlib.h>
#include <string.h>#include <libavutil/frame.h>
#include <libavutil/mem.h>#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>#define BUF_SIZE 20480static char *av_get_err(int errnum) {static char err_buf[128] = {0};av_strerror(errnum, err_buf, 128);return err_buf;
}static void decode(AVCodecContext *dec_ctx, AVPacket *packet, AVFrame *frame, FILE *outfile) {int ret = 0;ret = avcodec_send_packet(dec_ctx, packet);if (ret == AVERROR(EAGAIN)) {printf("Receive_frame and send_packet both returned EAGAIN, which is an API violation.\n");} else if (ret < 0) {printf("Error submitting the packet to the decoder, err:%s\n",av_get_err(ret));return;}while (ret >= 0) {ret = avcodec_receive_frame(dec_ctx, frame);if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF) {return;} else if (ret < 0) {printf("Error during decoding\n");exit(1);}if (!packet) {printf("get flush frame\n");}int data_size = av_get_bytes_per_sample(dec_ctx->sample_fmt);/**P表示Planar(平面),其数据格式排列方式为 :LLLLLLRRRRRRLLLLLLRRRRRRLLLLLLRRRRRRL...(每个LLLLLLRRRRRR为一个音频帧)而不带P的数据格式(即交错排列)排列方式为:LRLRLRLRLRLRLRLRLRLRLRLRLRLRLRLRLRLRL...(每个LR为一个音频样本)播放范例:   ffplay -ar 48000 -ac 2 -f f32le believe.pcm并不是每一种都是这样的格式*/// 这里的写法不是通用,通用要调用重采样的函数去实现// 这里只是针对解码出来是planar格式的转换for (int i = 0; i < frame->nb_samples; i++) {for (int ch = 0; ch < dec_ctx->channels; ch++) {fwrite(frame->data[ch] + data_size * i, 1, data_size, outfile);}}}
}static int read_packet(void *opaque, uint8_t *buf, int buf_size) {FILE *in_file = (FILE *) opaque;int read_size = fread(buf, 1, buf_size, in_file);printf("read_packet read_size:%d, buf_size:%d\n", read_size, buf_size);if (read_size <= 0) {return AVERROR_EOF;     // 数据读取完毕}return read_size;
}int main(int argc, char **argv) {if(argc != 3) {printf("usage: %s <intput file> <out file>\n", argv[0]);return -1;}const char *in_file_name = argv[1];const char *out_file_name = argv[2];//    const char *in_file_name = "/Users/lijinwang/Downloads/course/study/believe.aac";
//    const char *out_file_name = "/Users/lijinwang/Downloads/course/study/believe4.pcm";FILE *in_file = NULL;FILE *out_file = NULL;//1. 打开参数文件in_file = fopen(in_file_name, "rb");if (!in_file) {printf("open file %s failed\n", in_file_name);return -1;}out_file = fopen(out_file_name, "wb");if (!out_file) {printf("open file %s failed\n", out_file_name);return -1;}uint8_t *io_buffer = av_malloc(BUF_SIZE);AVIOContext *avio_ctx = (io_buffer, BUF_SIZE, 0, (void *) in_file, read_packet, NULL, NULL);AVFormatContext *format_ctx = avformat_alloc_context();format_ctx->pb = avio_ctx;int ret = avformat_open_input(&format_ctx, NULL, NULL, NULL);if (ret < 0) {printf("avformat_open_input failed:%s\n", av_err2str(ret));return -1;}//编码器查找AVCodec *codec = avcodec_find_decoder(AV_CODEC_ID_AAC);if (!codec) {printf("avcodec_find_decoder failed\n");return -1;}AVCodecContext *codec_ctx = avcodec_alloc_context3(codec);if (!codec_ctx) {printf("avcodec_alloc_context3 failed\n");return -1;}ret = avcodec_open2(codec_ctx, codec, NULL);if (ret < 0) {printf("avcodec_open2 failed:%s\n", av_err2str(ret));return -1;}AVPacket *packet = av_packet_alloc();AVFrame *frame = av_frame_alloc();while (1) {ret = av_read_frame(format_ctx, packet);if (ret < 0) {printf("av_read_frame failed:%s\n", av_err2str(ret));break;}decode(codec_ctx, packet, frame, out_file);}printf("read file finish\n");decode(codec_ctx,packet,frame,out_file);fclose(in_file);fclose(out_file);av_free(io_buffer);av_frame_free(frame);av_packet_free(packet);avformat_close_input(&format_ctx);avcodec_free_context(&codec_ctx);return 0;
}

AVIO内存输入模式相关推荐

  1. 做音视频开发要掌握哪些知识?

    最近有读者留言,说"想转行音视频开发,怎么做",正巧,前几天我还在某乎上,看到有人在问音视频的学习资料,还是个大一的学生. 想说一句:真有眼光. 如今这个时代,想赚钱,一个共识是, ...

  2. 2020年了,C++的就业方向该怎么走?

    这个得看你C/C++学到什么程度,已经熟练掌握了C/C++,我推荐你往音视频方向发展. 要不要从事音视频开发尤其是针对已经工作多年的朋友来说,这是一个职业规划的问题,每个人的职业经历.思考角度甚至利益 ...

  3. FFmpeg4.0笔记:本地媒体文件解码、帧格式转换、重采样、编码、封装、转封装、avio、硬解码等例子...

    Github https://github.com/gongluck/FFmpeg4.0-study/blob/master/official%20example/my_example.cpp #in ...

  4. FFmpeg/WebRTC/RTMP/RTSP/HLS/播放器-音视频流媒体高级开发【零声学院】

    FFmpeg/WebRTC/RTMP/RTSP/HLS/播放器-音视频流媒体高级开发 学习 音视频流媒体高级开发学习 01音视频基础 [录播]0-音视频开发高级课程简介(22分钟) 免费试学 [录播] ...

  5. 【三分钟学习FFMPEG一个知识点】FFMPEG关于avio_alloc_context申请使用内存释放问题

    问题: 使用ffmpeg发现av_malloc申请的内存最后不能用av_free函数释放,会崩溃. 代码示例: unsigned char * iobuffer = NULL; iobuffer = ...

  6. 最简单的基于FFmpeg的内存读写的例子:内存播放器

    ===================================================== 最简单的基于FFmpeg的内存读写的例子系列文章列表: 最简单的基于FFmpeg的内存读写的 ...

  7. ffmpeg 从内存中读取数据(或将数据输出到内存)

    更新记录(2014.7.24): 1.为了使本文更通俗易懂,更新了部分内容,将例子改为从内存中打开. 2.增加了将数据输出到内存的方法. 从内存中读取数据 ffmpeg一般情况下支持打开一个本地文件, ...

  8. ffmpeg解码内存中的数据

    需求 最近做一个项目需要播放一些简单的音频,而这些音频以二进制的形式存储在数据库中.而且需要保证音频的音频播放的实时性.故研究下如何从内存数据中解码音频. 开发 原帖中给的代码已经十分详细了.不过有几 ...

  9. 利用FFmpeg将H.264文件读入内存,再输出封装格式文件

    /***先将H.264文件读入内存,*再输出封装格式文件.*/ #include "stdafx.h"#define __STDC_CONSTANT_MACROSextern &q ...

最新文章

  1. python判断变量不为空_Python简洁方法
  2. 程序员面试题精选100题(45)-Singleton(C/C++/C#)
  3. python isodd奇偶_Python这些位运算的妙用,绝对让你大开眼界
  4. pt-online-schema-change 修改主键导致数据删除失败的问题调查
  5. VC++ (四)动态内存
  6. 关于强制休假的法律解释
  7. 深度学习实践指南(一)—— 卷积和池化
  8. windows mac linux 木马,针对Linux Windows macOS系统Adwind木马广告攻击
  9. linux 下的按键精灵 xdotool
  10. Gmail(以及Google其他服务)的可用IPV6地址【2013年01月12日测试可用】
  11. 笔记本电脑如何用c语言开无线网卡,教你如何用无线网卡做wifi热点(适用笔记本)...
  12. 电影赏析 002《毒战》
  13. 分享一个CCLE细胞系数据(CCLE数据库不能用了吗?)
  14. Win7系统下发生一个文件夹,无法删除,解决记录
  15. YC2440+wiggler小板+H-JATG+PCI转并口卡开发环境的搭建
  16. 一个50岁大叔学编程的真实故事——任何时候学习都不晚
  17. 操作系统——MFC实现进程创建和通信4
  18. 2020届一轮复习高中数学必考点高中函数知识点总结(纯干货)
  19. 卷积深层网络+图像定位
  20. android有nfc功能吗,nfc功能是什么_哪些手机有nfc功能 - 全文

热门文章

  1. Partition--分区总结
  2. 关于TobjectList的一点疑问
  3. CodeForces - 1174D Ehab and the Expected XOR Problem(构造+思维+位运算)
  4. CodeForces - 1454E Number of Simple Paths(基环树+思维)
  5. 中石油训练赛 - Bad Treap(数学)
  6. 牛客多校2 - Greater and Greater(bitset优化暴力)
  7. 2019ICPC(银川) - Largest Common Submatrix(单调栈)
  8. 制作linux安装镜像文件,制作CentOS 6.5一键自安装ISO镜像光盘 | 聂扬帆博客
  9. 0179-Largest Number( 最大数)
  10. 数据挖掘竞赛-轴承故障检测训练赛