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操作的更多相关文章

  1. FFmpeg内存IO模式(内存区作输入或输出)

    本文为作者原创,转载请注明出处:https://www.cnblogs.com/leisure_chn/p/10318145.html 所谓内存IO,在FFmpeg中叫作"buffered ...

  2. [.NET] 利用 async & await 进行异步 IO 操作

    利用 async & await 进行异步 IO 操作 [博主]反骨仔 [出处]http://www.cnblogs.com/liqingwen/p/6082673.html  序 上次,博主 ...

  3. 文件IO操作..修改文件的只读属性

    文件的IO操作..很多同行的IO工具类都是直接写..但是如果文件有只读属性的话..则会写入失败..所以附加了一个只读的判断和修改.. 代码如下: /// <summary> /// 创建文 ...

  4. python之协程与IO操作

    协程 协程,又称微线程,纤程.英文名Coroutine. 协程的概念很早就提出来了,但直到最近几年才在某些语言(如Lua)中得到广泛应用. 子程序,或者称为函数,在所有语言中都是层级调用,比如A调用B ...

  5. JAVASE02-Unit08: 文本数据IO操作 、 异常处理

    Unit08: 文本数据IO操作 . 异常处理 * java.io.ObjectOutputStream * 对象输出流,作用是进行对象序列化 package day08; import java.i ...

  6. JAVASE02-Unit07: 基本IO操作 、 文本数据IO操作

    基本IO操作 . 文本数据IO操作 java标准IO(input/output)操作 package day07; import java.io.FileOutputStream; import ja ...

  7. IO操作概念。同步、异步、阻塞、非阻塞

    “一个IO操作其实分成了两个步骤:发起IO请求和实际的IO操作. 同步IO和异步IO的区别就在于第二个步骤是否阻塞,如果实际的IO读写阻塞请求进程,那么就是同步IO. 阻塞IO和非阻塞IO的区别在于第 ...

  8. Java基础复习笔记系列 七 IO操作

    Java基础复习笔记系列之 IO操作 我们说的出入,都是站在程序的角度来说的.FileInputStream是读入数据.?????? 1.流是什么东西? 这章的理解的关键是:形象思维.一个管道插入了一 ...

  9. java中的IO操作总结

    一.InputStream重用技巧(利用ByteArrayOutputStream) 对同一个InputStream对象进行使用多次. 比如,客户端从服务器获取数据 ,利用HttpURLConnect ...

随机推荐

  1. 如何在获取celery中的任务执行情况

    开始以为在flower中获取,原来flower也是从celery中获取的. 如果直接用celery命令,一直会提示拒绝连接. 网上说了,用django命令就可以的. 于是试了下,OK了. 这样,至少可 ...

  2. Rule Compilation error xxx cannot be resolved

    说明:在eclipse中部署服务器时不报错,但在dos窗口中部署时报如下异常 原因:规则引擎drl文件文件中两个含义相同的变量的中文注释(只能用//,不能使用/**xxx*/或/*xxx*/)要保持相 ...

  3. (转载)使用curl 和 libjson 完成联网和数据解析

    转载地址:http://my.oschina.net/cocosgame/blog/71181 libjson 编译和使用 - 3. libjson的C接口 API http://blog.csdn. ...

  4. apache Apache winnt_accept: Asynchronous AcceptEx failed 错误的解决

    httpd配置文件中添加: AcceptFilter http noneAcceptFilter https none apache优化: http://blog.csdn.net/hytfly/ar ...

  5. Fresco 获得Bitmap

    ImageRequest imageRequest = ImageRequestBuilder .newBuilderWithSource( Uri.parse(getFeedItem(positio ...

  6. Python 的十个自然语言处理工具

    原文 先mark,后续尝试. 1.NLTK NLTK 在用 Python 处理自然语言的工具中处于领先的地位.它提供了 WordNet 这种方便处理词汇资源的借口,还有分类.分词.除茎.标注.语法分析 ...

  7. java 获取路径的各种方法

    (1).request.getRealPath("/");//不推荐使用获取工程的根路径 (2).request.getRealPath(request.getRequestURI ...

  8. css写无缝滚动

    html结构: <div class="authority"> <ul> <li> <img src="./images/rep ...

  9. CentOS7.5 firefox Flash插件更新

    CentOS7自带的firefox没有flash插件,所以是没有办法在网页上看视频的,需要自己手动安装 1.下载 打开flash官网https://get.adobe.com/flashplayer/ ...

  10. C++运算符重载规则

    运算符重载时要遵循以下规则:  ( 1 ) 除了类属关系运算符 " . " .成员指针运算符 " .* " .作用域运算符 " :: " . ...