ffmpeg的IO操作
ffmpeg 可以通过IO操作将数据读取和存储在文件或网络中 作为数据的读取和写入地址,数据被存放在file,http,
ffmpeg 不仅可以编解常用的音视频格式,还可以将数据导入/导出到各种媒介中。 当进行数据压缩时,流媒体数据可以从文件中获取,也可以借助各种专用网络协议从网络中获取。 当进行数据解压时,数据可以存放在文件中,也可以通过网路协议发送到远端。
在ffmpeg中针对不同媒介的数据操作方法被抽象为url_xxx,并记录在结构体 URLProtocol 中。 以文件操作为例:
/libavformat/file.c URLProtocol ff_file_protocol = { .name = "file", .url_open = file_open, .url_read = file_read, .url_write = file_write, .url_seek = file_seek, .url_close = file_close, .url_get_file_handle = file_get_handle, .url_check = file_check, }; 再比如网络协议rtsp操作: /libavformat/rtpproto.c URLProtocol ff_rtp_protocol = { .name = "rtp", .url_open = rtp_open, .url_read = rtp_read, .url_write = rtp_write, .url_close = rtp_close, .url_get_file_handle = rtp_get_file_handle, };
这些操作集通过REGISTER_PROTOCOL ();被注册到系统中,以ffplayer为例, av_register_all 会负责调用REGISTER_PROTOCOL()注册操作集
为了保证IO 操作的一致性,ffmpeg muxer/demuxer 调用函数一组avio_xxx 进行io操作,包括: avio_rxxx() avio_wxxx() avio_open() avio_close()
...
它们实际上是对 url_open url_read url_write url_cloge
...
的更高一层的抽象,使用avio_xxx 将隔离具体媒介的差异。
avio_rxx 和avio_wxxx 间接的调用ffurl_write 和 ffurl_read,实现读写操作。 而avio_open 则根据文件名判断并实现avio_rxx ,avio_wxxx 和 不同媒介的操作函数 ffurl_read, ffurl_read 之间的邦定。
avio_rxx 和avio_wxxx函数实际上只是对内存缓冲区中的数据进行操作,当缓冲区数据不足或将要溢出时, 调用flush_buffer() 或 fill_buffer() 把数据读写到媒介中。
avio_rxxx() 调用fill_buffer(AVIOContext *s) avio_wxxx() 调用flush_buffer(AVIOContext *s)
flush_buffer() 的实现主要通过回调函数s->write_packet fill_buffer() 的实现主要通过回调函数s->read_packet
在调用avio_open时: 1. ffurl_open 通过解析文件名,找出对应的操作集 URLProtocol 2. ffio_fdopen 调用ffio_init_context 把 URLProtocol 中的 ffurl_read ,ffurl_write , ffurl_seek注册到AVIOContext 结构体中 成为将回调函数write_packet ,read_packet和 seek
转自:http://blog.csdn.net/zhangxizhicn/article/details/6781339
ffmpeg的IO操作的更多相关文章
- FFmpeg内存IO模式(内存区作输入或输出)
本文为作者原创,转载请注明出处:https://www.cnblogs.com/leisure_chn/p/10318145.html 所谓内存IO,在FFmpeg中叫作"buffered ...
- [.NET] 利用 async & await 进行异步 IO 操作
利用 async & await 进行异步 IO 操作 [博主]反骨仔 [出处]http://www.cnblogs.com/liqingwen/p/6082673.html 序 上次,博主 ...
- 文件IO操作..修改文件的只读属性
文件的IO操作..很多同行的IO工具类都是直接写..但是如果文件有只读属性的话..则会写入失败..所以附加了一个只读的判断和修改.. 代码如下: /// <summary> /// 创建文 ...
- python之协程与IO操作
协程 协程,又称微线程,纤程.英文名Coroutine. 协程的概念很早就提出来了,但直到最近几年才在某些语言(如Lua)中得到广泛应用. 子程序,或者称为函数,在所有语言中都是层级调用,比如A调用B ...
- JAVASE02-Unit08: 文本数据IO操作 、 异常处理
Unit08: 文本数据IO操作 . 异常处理 * java.io.ObjectOutputStream * 对象输出流,作用是进行对象序列化 package day08; import java.i ...
- JAVASE02-Unit07: 基本IO操作 、 文本数据IO操作
基本IO操作 . 文本数据IO操作 java标准IO(input/output)操作 package day07; import java.io.FileOutputStream; import ja ...
- IO操作概念。同步、异步、阻塞、非阻塞
“一个IO操作其实分成了两个步骤:发起IO请求和实际的IO操作. 同步IO和异步IO的区别就在于第二个步骤是否阻塞,如果实际的IO读写阻塞请求进程,那么就是同步IO. 阻塞IO和非阻塞IO的区别在于第 ...
- Java基础复习笔记系列 七 IO操作
Java基础复习笔记系列之 IO操作 我们说的出入,都是站在程序的角度来说的.FileInputStream是读入数据.?????? 1.流是什么东西? 这章的理解的关键是:形象思维.一个管道插入了一 ...
- java中的IO操作总结
一.InputStream重用技巧(利用ByteArrayOutputStream) 对同一个InputStream对象进行使用多次. 比如,客户端从服务器获取数据 ,利用HttpURLConnect ...
随机推荐
- Java容器---Collection接口中的共有方法
1.Collection 接口 (1)Collection的超级接口是Iterable (2)Collection常用的子对象有:Map.List.Set.Queue. 右图中实现黑框的ArrayLi ...
- beego学习笔记(3)
相对复杂一点的示例: package main import "github.com/astaxie/beego" type MainController struct{ beeg ...
- 关于HTML&CSS的笔记
最近在看Jon Duckett的HTML&CSS一书(http://book.douban.com/subject/6585090/),书的排版和讲解方式很不错,并且有许多其他教学材料遗漏的关 ...
- MySQL5.7 centos7.2 yum 安装
1.配置YUM源 在MySQL官网中下载YUM源rpm安装包:http://dev.mysql.com/downloads/repo/yum/ # 下载mysql源安装包 shell> wge ...
- js求区间随机数
function rnd(n, m){ var random = Math.round(Math.random()*(m-n)+n); return random; }
- eclipse 创建 maven 项目时如何修改 web 的版本和 jdk 的版本
eclipse 创建 maven 项目时如何修改 web 的版本和 jdk 的版本 在使用 eclipse 创建 maven 项目的时候,默认的 web.xml 的版本时 2.3,默认 jre 的版本 ...
- ul>li中自定义属性后取值的问题
动态赋值的li: $.ajax({ type: "POST", url: "${base}/before/subDemand/listType", succes ...
- C++后台研发面试总结
前言: 从中秋到国庆这几天面试了几家公司,有大公司也有小公司,连续几天面试没有系统的整理整理,正好有时间系统的整理一下,好多考点牛客的大佬们都分享过了,虽然每个人的方向不相同,不过多看一些总能找到一些 ...
- phpstorm使用和配置技巧
1. 使用phpstorm的过程中,有时光标不小心变成了方块状,怎么修复回来呢? 见下图,去掉“Use block caret” 前面的对勾即可. 2.多项目并存的问题 PhpStorm或 WebSt ...
- 【转】使用 python IDLE 自带的 debuger 进行调试
IDLE自带了调试器(虽然不怎么使吧). 关于如何在 IDLE 中进行调试网上的教程讲的很模糊,于是自己整理了一下,和大家分享~ 第一步:打开python shell,并在shell中打开debuge ...