1.MP4çMKVç¼ç
2.每日开源:一个巨硬的产品级嵌入式流媒体库
3.“OSM”代表什么?
4.GStreamer基础教程(十)
MP4çMKVç¼ç
è¿ä¸ªä½ å¯ä»¥åèä¸ä¸ç¾ç§
MKVæ å¿mkvä¸åäºDivXãXviDçè§é¢ç¼ç æ ¼å¼ï¼ä¹ä¸åäºMP3ãOggçé³é¢ç¼ç æ ¼å¼ãMKVåªæ¯ä¸ºè¿äºé³ãè§é¢æä¾å¤å£³çâç»åâåâå°è£ âæ ¼å¼ãæ¢å¥è¯è¯´å°±æ¯ä¸ç§å®¹å¨æ ¼å¼ï¼å¸¸è§ç AVlãVOBãMPEGãRM æ ¼å¼å ¶å®ä¹é½å±äºè¿ç§ç±»åãä½å®ä»¬è¦ä¹ç»æéæ§ï¼è¦ä¹ä¸å¤å¼æ¾ï¼è¿æä¿æäºMKVè¿ç±»æ°åå¤åªä½å°è£ æ ¼å¼çè¯çã Matroskaåªä½å®ä¹äºä¸ç§ç±»åçæ件ï¼MKVæ¯è§é¢æ件ï¼å®éé¢å¯è½è¿å å«æé³é¢ååå¹ï¼MKAæ¯åä¸çé³é¢æ件ï¼ä½å¯è½æå¤æ¡åå¤ç§ç±»åçé³è½¨ï¼MKSæ¯åå¹æ件ãè¿ä¸ç§æ件以MKVæ为常è§ã MKVæ大çç¹ç¹å°±æ¯è½å®¹çº³å¤ç§ä¸åç±»åç¼ç çè§é¢ãé³é¢ååå¹æµï¼çè³è¿é常å°éç RealMedia å QuickTime è¿ç±»æµåªä½ä¹è¢«å®åæ¬è¿å»ï¼å¯ä»¥è¯´æ¯å¯¹ä¼ ç»åªä½æ ¼å¼çä¸æ¬¡å¤§é¢ è¦ï¼å ä¹åæäºä¸ä¸ªä¸è½çåªä½å®¹å¨ã ææ¾MKV并ä¸éè¦ä¸ç¨çææ¾å¨ï¼ä»»ä½åºäºDirectShowçææ¾å¨é½è½ææ¾å®ï¼å¦å¸¸è§ç Media Player ClassicãBSplayerãZoomPlayer ææ¾å¨çï¼çè³å æ¬Windows Media playerï¼ä» éå®è£ ç¸åº Matroska 解ç å离å¨æ件å³å¯ãæ¨èä¸è½½HappyShowè¿ä¸ªè§£ç å¨éæ软件ã
[ç¼è¾æ¬æ®µ]ç¹ç¹
Matroskaæ大çç¹ç¹å°±æ¯è½å®¹çº³å¤ç§ä¸åç±»åç¼ç çè§é¢ãé³é¢ååå¹æµï¼çè³åæ¬äºRealMediaåQuickTimeè¿ç±»æµåªä½ï¼å¯ä»¥è¯´æ¯å¯¹ä¼ ç»åªä½å°è£ æ ¼å¼çä¸æ¬¡å¤§é¢ è¦ï¼å®ç°å¨å ä¹åæäºä¸ä¸ªä¸è½çåªä½å®¹å¨ï¼ç®åå®æè½å°è£ çè§é¢ãé³é¢ãåå¹ç±»åå æ¬ï¼ AVIæ件ï¼å æ¬éç¨DivXãXviDã3ivXãVP6è§é¢ç¼ç ï¼åPCMãMP3ãAC3çé³é¢ç¼ç çAVI RealMediaæ件ï¼å æ¬RealVideoåRealAudio QuickTimeçMOVåMP4è§é¢ Windows Mediaæ件ï¼å æ¬ASFãWMVæ ¼å¼ MPEGæ件ï¼å æ¬MPEG-1/2çM1VãM2V Ogg/OGM æ件ï¼å æ¬Ogg VorbisãOGMãFLACæ件 Matroska Mediaæ件ï¼å æ¬MKVãMKAãMKSæ件 WAVãAC3ãDTSãMP2ãMP3ãAAC/MP4é³é¢ SRTãUSFåSSA/ASSææ¬åå¹ SubVobå¾å½¢åå¹ï¼åç¼ä¸ºIDXãSUB BMPå¾å½¢åå¹ï¼ä»¥ä¸ç»BMPå¾çåæ¶é´ç ææçåå¹ ã æ¤å¤ï¼Matroskaæ件ä¸è¿å¯å æ¬ç« èãæ ç¾ï¼Tagï¼çä¿¡æ¯ï¼çè³è¿å¯å ä¸é件ï¼éè¦æåºçMatroskaæè°çå°è£ AVIãRMãMOVçåªä½ï¼ä½å®å¹¶ä¸æ¯ç®åå°å®ä»¬ä¸å æ¹åçå并å°Matroskaä¸ï¼èæ¯å°å®ä»¬çé³è§é¢æµè¿è¡äºéæ°ç»ç»ã Matroskaå å ¥AVIæ没æçEDCé误æ£æµä»£ç ï¼è¿æå³çå³ä½¿æ¯æ²¡æä¸è½½å®æ¯çMKVæ件ä¹å¯ä»¥é¡ºå©åæ¾ï¼è¿äºå¯¹AVIæ¥è¯´å®å ¨æ¯ä¸å¯æ³è±¡çãè½ç¶Matroskaå å ¥äºé误æ£æµä»£ç ï¼ä½ç±äºéç¨äºæ°çæ´é«æçç»ç»ç»æï¼ç¨MKVå°è£ åççµå½±è¿æ¯æ¯AVIæºæ件è¦å°äºçº¦1%ï¼è¿å°±æ¯è¯´å³ä½¿å ä¸äºå¤ä¸ªåå¹ï¼MKVæ件çä½ç§¯ä¹ä¸å¯è½æ¯AVIæ件大ã Matroskaæ¯æå¯å帧çï¼VFRï¼å³Variable Frame Rateï¼çè§é¢ç¼ç ï¼è¿ç§VFRè§é¢ç帧çæ¯ä¸åºå®çï¼å®å¯å¨å¨æç»é¢ä¸ä½¿ç¨è¾å¤§ç帧çï¼èå¨éæç»é¢ä¸ä½¿ç¨è¾å°ç帧çï¼è¿æ ·å¯ä»¥ææçåå°è§é¢æ件çä½ç§¯ï¼å¹¶æ¹åå¨æç»é¢çè´¨éãå®çä½ç¨æ¯ç®å广æ³ä½¿ç¨çVBRï¼å¯åç çï¼æ´ä¸ºææ¾ã ççç®åæ¯è¾æµè¡çå¤åªä½å®¹å¨ç±»åï¼ä¾å¦AVIï¼å®å¯ä»¥å®¹çº³å¤ç§ç±»åçè§é¢ç¼ç åé³é¢ç¼ç ï¼åVP6ãDivXãXviDçè§é¢ç¼ç åPCMãMP3ãAC3çé³é¢ç¼ç ï¼ VOBåæ¯å¦ä¸ç§ç¹ç¹æ´ä¸ºé²æçåªä½å®¹å¨ï¼å®å¯å®¹çº³MPEG-2è§é¢æµãå¤ä¸ªAC3ã DTSãTHXãPCMé³é¢æµãå¤ä¸ªä¸åè¯è¨çå¾å½¢åå¹æµã
[ç¼è¾æ¬æ®µ]å ¼å®¹æ§
aviçåºç°å·²ç»è¶ è¿äºå¹´ï¼æ¸æ¸ä½ç°åºèæäºï¼é¤äºè¿å¹´éè¿VDå¯ä»¥æ¥æ2个é³è½¨ï¼æ²¡æå ¶ä»çæ¹è¿ã ogmçåºç°ï¼æ å¿çå¤é³è½¨æ ¼å¼çåºç°ï¼å¯ä»¥åæ8个以ä¸çé³è½¨ï¼é³é¢ä¸èªç¶ä¹å¤äºoggè¿ä¸ªæ ¼å¼ï¼éè¦çæ¯å¯ä»¥âå æâåå¹ï¼èå¤ç§°ä¸ºâ软åå¹âï¼å¯ä»¥ä»»æå¼å ³ï¼å¯ä»¥âå æâ8个以ä¸çåå¹ï¼ç¾ä¸ä¸è¶³çæ¯ä» ä» æ¯æsrtæ ¼å¼ï¼å¹¶ä¸ä¸æ¯æUnicodeï¼å¯¹äºæ´²å符æ¯æ严éä¸è¶³ã è¿æä¸ä¸ªå°±æ¯Chapteråè½ï¼å¯ä»¥èªå®ä¹æ®µè½ï¼ææ¾æ¶å°±å¯ä»¥éæ©äºãæ¯ä¸æ¯è¶æ¥è¶åDVDå¦ï¼ä½æ¯å½æ¶çogmæºç æ¯ä¸å ¬å¼çï¼å°±é£ä¹å 个人å¨å¼åï¼èªç¶è¿åº¦æ ¢äºï¼åä¸éµå ä¹é·å ¥äºâæ»äº¡âãæè¿å®£å¸å ¬å¼æºç ï¼å å ¥Open Sourceè¡åï¼éæ°å¼å§å¼åã mkvå°±æ¯å¨ogmåæ»çé£æ®µæ¶é´åºç°çï¼ç±ä¿ç½æ¯çç¨åºåå¼åçï¼ä»ä¸å¼å§å°±æ¯Open Sourceï¼å æ¤å¾å°äºå¾å¤å ¶ä»ç¨åºåç帮å©ï¼å¼åé度ç¸å½å¿«ã ogmæçmkvé½æï¼å¦å¤è¿æå¾å¤ç¬ç¹çåè½ãå ¶ä¸æ令人æ¯å¥çå°±æ¯Gabest(å¼åvobsubçå ¬å¸)å¼åçPluginï¼ä¸ä» å¼åäºä¸é¨çææ¾å¨Media Player Classic(ä¿ç§°MPC)ï¼ è¿ä¸ªä¸è¥¿ç强大ç¸ä¿¡ç¨è¿ç人é½æä½ä¼ãè¿å¼åäºå¾å¤çMKVç¨çMux(åæå¨)ï¼å°¤å ¶æ¯Realæ ¼å¼çMuxã Realçrmvbæ¯å°éæ ¼å¼ï¼å®æ¹çHelixæ ¹æ¬å°±ä¸æ¯æå¤å£°éæ以尽管ç®æ³å¾ä¼ç§ï¼ä½å¨å£°æ大ççåç°ä¸å°±æ è½ä¸ºåäºï¼åªè½ä¹ä¹è®©ä½ç»å¯ä»¥åæAC3åDTSçavi以åogmäºã ä½Gabestå¼åçRealmedia Splitteråmkv Muxå¯ä»¥è®©rmvbæ ¼å¼çè§é¢åAC3ãDTSåæmkvï¼ä»æ ¹æ¬ä¸å æäºrmvbé³é¢ä¸çå¼±ç¹ãä¸ä» å¦æ¤ï¼è¿å¼åäºVSFilter.dllåSubtitleSource.axè¿2个Pluginï¼å®£å¸æ¯æssaåassçæ ¼å¼è½¯åå¹ã æ»ç»å°±æ¯ä¸é¢å æ¡ï¼ 1.æ¯æå¤ç§æ ¼å¼çè§é¢åé³é¢ï¼å°¤å ¶æ¯Real ï¼ 2.æ¯æå¤é³è½¨ï¼å¤è¾¾æ¡ä»¥ä¸ ï¼ 3.æ¯æssaï¼ass软åå¹ï¼å¤è¾¾æ¡ä»¥ä¸ ï¼ 4.æ¯æ段è½éå(ç±å¶ä½äººå³å®) ã
[ç¼è¾æ¬æ®µ]åå±åé
Matroskaçç®æ å°±æ¯è¦å代æ§å¼çåªä½å°è£ æ ¼å¼ï¼å ¶ä¸æ主è¦çç®æ å°±æ¯AVIã AVIå·²ç»è¯çåå å¹´äºï¼ç®åå®ä¾ç¶è¿ä¿æçæºçççå½åï¼ä½å ¶åå§æ¶æè¿äºéæ§ï¼è¿ä½¿å¾å®å¨æ¯ææ°çé³è§é¢ç¼ç ä¸é常å°é¾ï¼å¨é微软平å°ä½¿ç¨ä¹ä¸å¤æ¹ä¾¿ãèMatroska使ç¨çæ¯ä¸ç§å¼æ¾çæ¶æï¼æ¥æä¼å¤çå è¿ç¹æ§ï¼å¹¶ä¸è½è·¨å¹³å°ä½¿ç¨ï¼è¿æ¯AVIææå°è«åçã ä¸è¿AVlæ¯ç«æ å¤§æ ¹æ·±ï¼å®æ¥ææ广æ³ç软硬件æ¯æï¼èè¿ä¸ç¹æ£æ¯è¡¡éMKVæ¯å¦æåçä¸ä¸ªæ å¿ï¼ä½ç®åå®è¿åä¸å°è¿ç¹ï¼ç°å¨çè³è¿æ²¡åºç°ä¸ä¸ªè½ç´æ¥ç¼è¾å®ç软件ï¼æ¯ç«å®è¯çè¿ä¸å°ä¸å¹´ãä½å¨è¿ä¹ççæ¶é´éï¼Matroskaåå¾çè¿å±ä¹æ¯é常å¼äººæ³¨ç®çã ä½Matroskaæ¯ç«è¿æ¯ä¸ç§åå±ä¸çææ¯ï¼å®æ²¡ææ·±åçèæ¯å¯ä»¥ä¾æï¼è¿å³å®äºå®ä¸å¯è½å¨åä¸é¢å(å¦DVãæ°åçµè§)éææä½ä¸ºï¼åæ ·çéçï¼å®è¦æ³å代 AVIæ为ä¸ç§éç¨çå¤åªä½å°è£ æ ¼å¼å¹¶ä¸ä¼åå顺å©ãä¸è¿ï¼DVDRipçæ®ååç¨åè¯æ们ï¼æµè¡ææ¯ç¡¬éç!DVDææ¾æºååç°å¨ä¸æ¯ä¹å·²ç»æ¾ä¸æ¶åï¼å¯¹DVDRipæä¾æ¯æäºä¹ãæ以ï¼Matroskaç®åæéè¦åçå°±æ¯è®©æ´å¤ç人ç¥éå®ã MKVçç®æ 建ç«ä¸ä¸ªç°ä»£ãçµæ´»ã延伸æ§ãå¤å¹³å°çäºèç½æå¡å¨ï¼å¿«éæ¥æ¾æä»¶ï¼ åå±ä¸å¥åä½åç¼è¾ç¨çMatroskaæä»¶å·¥å ·ï¼å¹¶å¨GNUéç¨å ¬å ±è®¸å¯è¯ä¸åå¸ï¼ å¼åä¸ä¸ªç½ç»å¾ä¹¦é¦ï¼å 许å¼åè åMatroskaç³è¯·ï¼å°ä»ä»¬èªè¡å¼åçåºç¨è½¯ä»¶å å ¥Matroskaé³é¢æ ¼å¼ï¼å¹¶å¨GNU宽éç¨å ¬å ±è®¸å¯è¯ä¸åå¸ï¼ ä¸ç¡¬ä»¶å¶é ååä½ï¼æä»ä»¬çé³é¢æ ¼å¼åµå ¥å¤åªä½ç设å¤éï¼ æ¯æ以Matroskaå¨åç§åæ ·çæä½ç³»ç»ï¼å æ¬WindowsãDirectShowãLinuxãHaikuåå¤åªä½å¤çæ¡æ¶GStreamerï¼çè¿ä½ ã [1]
每日开源:一个巨硬的产品级嵌入式流媒体库
哈喽,我是老吴。
今天分享一个比较复杂的开源项目:live 是一个开源的流媒体库,用于实现实时流媒体的传输和处理。它提供了一套跨平台的 C++ 类库,帮助快速构建高效、电商 源码交付可靠的流媒体服务器和客户端应用程序。
live的代码量庞大,约9w行代码。如果专注于核心逻辑,代码量缩减到约8K行。使用live,你可以收获高效可靠的流媒体库,了解产品级的C++项目设计,掌握音视频基础知识,甚至获得基于select()的C++事件循环库。live在媒体播放器、流媒体服务器、视频监控系统等领域应用广泛,如VLC、FFmpeg、源码mbtiGStreamer均使用live实现流媒体的接收和播放。
live基于C++,语法相对简单,适合专注于学习C++类设计和编写专业的C++软件。为了理解源码,需要补充多媒体、流媒体的理论知识。通过阅读和运行相关应用,加深对理论知识的理解。
编译live库后,会生成4个静态库:libBasicUsageEnvironment.a和libUsageEnvironment.a用于实现事件循环、上下文管理、任务管理等;libliveMedia.a负责多媒体流化,包括音视频编解码、流媒体协议实现;libgroupsock.a负责网络IO功能,核心是TCP、UDP的读写。简单示例是RTP传输MP3音频,涉及server和client两个程序。
server程序的log源码核心逻辑包括准备运行环境、设置数据来源、设置数据目的地。TaskScheduler用于任务管理,基于select()实现事件循环。BasicUsageEnvironment用于上下文管理。数据流化本质是网络传输,Source和Sink分别表示数据源和目的地,本例中Source是MP3FileSource,Sink是MPEG1or2AudioRTPSink。client端程序同样初始化Source和Sink。
RTP协议简介,RTP(Real-time Transport Protocol)是一种用于实时传输音频和视频数据的网络传输协议,基于UDP,用于在IP网络上传输实时媒体数据。RTP协议设计目标是提供低延迟、高效率的传输,以满足实时应用需求。主要特点包括时间戳、序列号、负载类型、宁德源码NACK反馈和RTCP(Real-time Transport Control Protocol)等。
关键问题是如何实现数据一帧帧流化?关注点不是具体音视频格式解析或特定协议实现,而是live对音视频流化的整体框架。通过示例分析,live本质上将音视频数据逐帧解码,通过RTP协议经网络发送。live封装了多种数据Source和Sink,但无需详细了解每个概念。仍以RTP传输MP3数据为例,分析live的工作流程。
首先,需要对相关类的关系有大概概念:MediaSource是所有Source的父类,各种具体音视频Source基于其派生;MediaSink是所有Sink的父类,派生出FileSink、RTPSink等众多Sink类。Sink类最关键的成员函数是startPlaying(),用于使用Source对象获取帧数据,然后发送至网络。
RTP传输MP3的主要逻辑包括准备就绪后调用MediaSink::startPlaying()启动数据流化,在packFrame()调用Source对象的ctmediator源码getNextFrame()。getNextFrame()最终调用MP3FileSource的doGetNextFrame(),负责MP3音频解码,解码完成后,回调afterGettingFrame(),正常时调用sendPacketIfNecessary()发送数据,并添加至事件循环调度器中。一段时间后,MultiFramedRTPSink的sendNext()被调用,推动新一帧数据传输,直到Source中的所有帧数据被消费。
live如何创建RTSP服务器?通常RTP协议与RTSP协议结合使用,对外提供RTSP服务器服务。RTSP提供控制实时流媒体传输和播放的标准化方式,可以控制播放、暂停、停止、快进、后退等功能。添加几行代码即可创建RTSP服务器。RTSP服务器封装实现RTSP服务,类似HTTP协议,是文本协议。服务器包括接受客户端连接、读取客户端数据、解析和处理数据的操作。
总结,live是一个开源的多媒体流媒体库,支持常见流媒体协议,提供高效可靠的流媒体传输功能,适用于构建流媒体服务器和客户端应用程序。使用live需要熟悉C++编程和网络编程知识,官方提供丰富示例代码,帮助快速熟悉库的使用方法。
“OSM”代表什么?
OSM,全称为 "Open Source Media",在中文里被译为“开源媒体”。这个缩写词在英文世界中表示一种基于开放源代码原则的媒体处理和分发方式,它涉及到的技术平台、系统和应用广泛应用于互联网和多媒体领域。
OSM的中文拼音为“kāi yuán méi tǐ”,在英语中的流行度达到了次,显示出它在技术社区中的活跃度。它的分类主要属于互联网缩写词,但具体应用领域广泛,如教育平台、多媒体开发、数据中心能源管理等。例如,GStreamer,一个开源的多媒体框架,就经常与OSM一起使用,为各种媒体流(如音频和视频)提供无缝连接的解决方案。
青岛国际帆船中心媒体中心的研究项目中,也采用了开式间接式海水源热泵系统,这正是OSM理念在实际应用中的一个实例。总的来说,OSM代表了一种开放、透明和协作的媒体处理模式,对于推动技术创新和资源共享具有重要作用。
请注意,尽管OSM的信息来源于网络,主要用于学习和交流,但使用者需自行甄别其适用性,以避免潜在风险。版权信息应归原作者所有,仅供学习参考。
GStreamer基础教程(十)
GStreamer教程详解(十) 作为强大的流媒体开发框架,GStreamer的特点在于其模块化设计,允许无缝集成新插件。然而,这种灵活性也伴随着复杂性,特别是对于新插件的开发。本指南旨在深入讲解如何使用GStreamer,特别是通过C语言开发音频过滤器插件,以扩展现有功能。入门指南
本指南针对的读者群体包括:无需开发新功能,仅使用GStreamer现有功能的用户;或对现有插件进行应用程序开发,但无需从零开始创建的开发者。如果您需要GStreamer应用程序开发的具体帮助,应查看相关应用手册。编写插件
章节内容将引导您从零开始构建插件,从获取模板源代码开始。首先,通过命令行工具获取gst-template模块的副本,它提供了创建基础插件的模板。通过运行`make_element`命令,您可以根据需要创建自定义的MyFilter插件,最后会生成gstmyfilter.c和gstmyfilter.h文件。基础构建
创建新元素时,需要定义其名称、作者等元数据,这称为样板。通过复制模板并添加功能,`gst-plugin/tools`中的make_element工具简化了这一过程。在gst-plugin/src目录下运行make_element命令,例如:`make_element MyFilter gst-plugin/src`。基本代码检查
虽然大部分接口由GStreamer自动处理,但头文件中的代码仍需编写。例如,使用`GST_ELEMENT_REGISTER_DEFINE`宏来注册元素和其函数,如`GST_ELEMENT_REGISTER (my_filter)`。元数据和pad模板
元素元数据提供了额外信息,通过`gst_element_class_set_metadata`进行设置。pad模板描述了元素的输入输出端口,`gst_element_class_add_pad_template`用于注册。构造函数
元素有两个构造函数:_class_init(初始化类)和 _init(初始化实例)。plugin_init函数用于检查依赖并注册元素类型。pad配置
pad是数据流的入口和出口,需要在元素_init()函数中创建并配置。`gst_pad_new_from_static_template`用于基于静态模板创建实际pad,并设置事件和查询处理函数。深入理解
教程随后深入讲解了状态管理、属性、信号等概念,帮助您更好地理解和使用GStreamer插件的高级功能。