转贴--音频视频解决方案:GStreamer/ffmpeg/ffdshow/directshow/vfw

本文对比介绍了GStreamer、ffmpeg、DirectShow及VFW等流行音频视频编程框架的特点和应用场景,涵盖了从音视频处理到流媒体播放等多个方面。

本文转自http://hi.baidu.com/gaomanyi/blog/item/f5d172598107572c2934f048.html

 

音频视频编程相关:GStreamer/ffmpeg/directshow/vfw
linux和window下几种流行的音频视频编程框架作一个总结,防止自己迷惘,免于晕头转向。

一、GStreamer

GStreamer is a library that allows the construction of graphs of media-handling components, ranging from simple Ogg/Vorbis playback to complex audio (mixing) and video (non-linear editing) processing.
GStreamer是一个开源的多媒体框架库。利用它,可以构建一系列的媒体处理模块,包括从简单的ogg播放功能到复杂的音频(混音)和视频(非线性编辑)的处理。
应用程序可以透明的利用解码和过滤技术。开发者可以使用简洁通用的接口来编写一个简单的插件来添加新的解码器或滤镜
gstreamer是linux上的(也支持其它系统) multi-media framework 多媒体应用框架。一直以来,linux上的多媒体开发都很麻烦,由于没有统一模型,所以很多东西都需要自己实现(或者code copy)。gstreamer的目的就是弥补这一缺陷。gstreamer有一个核心,核心管理许多的elements。每个element都有自己的 功能,比如:音量控制、mp3解码、从硬盘读取多媒体数据、把声音发往声卡等。用户变成所需要做的,就是把用得着的elements串成线 (pipeline)。多媒体流就可以在pipeline里流动了,一旦pipeline正常工作,就意味着音乐出来了、vedio出来 了...pipeline是在单独的线程中运行的,所以你不必担心自己的进程会阻塞。 并且pipeline线程的管理(创建、销毁、IPC等)都是gstreamer自己负责的,用户程序只需要对其发出控制信息久可以了。
在Window平台上有DirectShow体系,则在linux平台上有GStreamer框架.

二、ffmpeg

FFmpeg is a complete solution to record, convert and stream audio and video. It includes libavcodec, the leading audio/video codec library. FFmpeg is developed under Linux, but it can compiled under most operating systems, including Windows.

ffmpeg项目由以下几部分组成:
ffmpeg 视频文件转换命令行工具,也支持经过实时电视卡抓取和编码成视频文件.
ffserver 基于HTTP(RTSP正在开发中)用于实时广播的多媒体服务器.也支持时间平移
ffplay 用 SDL和FFmpeg库开发的一个简单的媒体播放器
libavcodec 一个包含了所有FFmpeg音视频编解码器的库.为了保证最优性能和高可复用性,大多数编解码器从头开发的.
libavformat 一个包含了所有的普通音视格式的解析器和产生器的库.
三、

ffdshow

ffdshow is DirectShow and VFW codec for decoding/encoding many video and audio formats, including DivX and XviD movies using libavcodec, xvid and other opensourced libraries with a rich set of postprocessing filters.

ffdshow是对一些codec(ffmpeg, xvid, and other)的封装,封装成了DirectShow和VFW的标准组件。比如对于xvid来讲,ffdshow是可以选择具体使用那个codec的, ffmpeg(libavcodec) or xvid。那么封装有没有额外的成本哪?有,但对大部分应用来讲,可以忽略不计。就如c++和c。
vfw和dshow里的CODEC分别是通过fourcc码和guid机制寻找的,可以在系统注册codec后调用,比自带编解码库形式更加统一,便于使 用。此外,vfw和dshow是代表了两个微软不同时期的音视频处理封装库,里面包含了音视频驱动,音视频处理的一整套方案。

三、DirectShow
DirectShow是微软公司在ActiveMovie和Video for Windows的基础上推出的新一代基于COM的流媒体处理的开发包,与DirectX开发包一起发布。目前,DirectX最新版本为9.0。 DirectShow为多媒体流的捕捉和回放提供了强有力的支持。运用DirectShow,我们可以很方便地从支持WDM驱动模型的采集卡上捕获数据, 并且进行相应的后期处理乃至存储到文件中。这样使在多媒体数据库管理系统(MDBMS)中多媒体数据的存取变得更加方便。DirectShow是微软公司 提供的一套在Windows平台上进行流媒体处理的开发包,与DirectX开发包一起发布。
运用DirectShow,我们可以很方便地从支持WDM驱动模型的采集卡上捕获数据,并且进行相应的后期处理乃至存储到文件中。它广泛地支持各种媒体格 式,包括Asf、Mpeg、Avi、Dv、Mp3、Wave等等,使得多媒体数据的回放变得轻而易举。另外,DirectShow还集成了DirectX 其它部分(比如DirectDraw、DirectSound)的技术,直接支持DVD的播放,视频的非线性编辑,以及与数字摄像机的数据交换。

四、vfw
Video For Windows

WARNING: gstreamer1.0-plugins-base-1.16.2-r0 do_fetch: Failed to fetch URL file://gst-plugins-base-1.16.2.tar.xz, attempting MIRRORS if available ERROR: gstreamer1.0-plugins-base-1.16.2-r0 do_fetch: Fetcher failure: Unable to find file file://gst-plugins-base-1.16.2.tar.xz anywhere. The paths that were searched were: /home/bstos/openembedded-core/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base-1.16.2/bstos /home/bstos/openembedded-core/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base/bstos /home/bstos/openembedded-core/meta/recipes-multimedia/gstreamer/files/bstos /home/bstos/openembedded-core/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base-1.16.2/a1000 /home/bstos/openembedded-core/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base/a1000 /home/bstos/openembedded-core/meta/recipes-multimedia/gstreamer/files/a1000 /home/bstos/openembedded-core/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base-1.16.2/aarch64 /home/bstos/openembedded-core/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base/aarch64 /home/bstos/openembedded-core/meta/recipes-multimedia/gstreamer/files/aarch64 /home/bstos/openembedded-core/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base-1.16.2/aarch64 /home/bstos/openembedded-core/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base/aarch64 /home/bstos/openembedded-core/meta/recipes-multimedia/gstreamer/files/aarch64 /home/bstos/openembedded-core/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base-1.16.2/ /home/bstos/openembedded-core/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base/ /home/bstos/openembedded-core/meta/recipes-multimedia/gstreamer/files/ /home/bstos/build/../downloads ERROR: gstreamer1.0-plugins-base-1.16.2-r0 do_fetch: Fetcher failure for URL: 'file://gst-plugins-base-1.16.2.tar.xz'. Unable to fetch URL from any source. ERROR: gstreamer1.0-plugins-base-1.16.2-r0 do_fetch: ERROR: gstreamer1.0-plugins-base-1.16.2-r0 do_fetch: Function failed: base_do_fetch ERROR: Logfile of failure stored in: /home/bstos/build/tmp/work/aarch64-bst-linux/gstreamer1.0-plugins-base/1.16.2-r0/temp/log.do_fetch.24397 ERROR: Task (/home/bstos/openembedded-core/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base_1.16.2.bb:do_fetch) failed with exit code '1'
最新发布
09-29
<think>我们正在处理的是Yocto构建中关于gstreamer1.0-plugins-base在do_fetch阶段无法获取本地文件的问题。具体来说,错误是找不到`file://gst-plugins-base-1.16.2.tar.xz`。 根据问题描述,我们需要分析为什么do_fetch阶段无法获取这个本地文件。在Yocto中,`file://`协议用于指定本地文件系统中的文件,通常这些文件存放在配方(recipe)所在的目录下的`files`子目录中,或者放在由`FILESPATH`变量指定的路径中。 可能的原因和解决方案: 1. **文件不存在于预期位置**:检查配方中指定的文件是否确实存在于配方目录下的`files`子目录中。或者,检查是否通过`SRC_URI`正确指定了文件路径。 2. **文件路径设置错误**:Yocto通过`FILESPATH`变量来搜索文件。如果文件不在默认路径下,可能需要修改`FILESPATH`变量或显式指定路径。 3. **网络设置问题**:虽然使用的是`file://`协议,但Yocto构建环境有时会因为网络设置(如`BB_NO_NETWORK`)而影响本地文件的获取。例如,如果设置了`BB_NO_NETWORK = "1"`,则构建系统将不允许任何网络访问,但通常不会影响本地文件。不过,我们也可以检查一下该设置。 4. **文件权限问题**:确保构建用户对文件有读取权限。 5. **配方中的SRC_URI设置**:检查配方的`SRC_URI`是否包含了该文件。例如,在配方中应该有类似: ``` SRC_URI = "file://gst-plugins-base-1.16.2.tar.xz" ``` 或者,如果文件在子目录中,可能需要指定路径: ``` SRC_URI = "file:///path/to/file/gst-plugins-base-1.16.2.tar.xz" ``` 但通常,我们不会使用绝对路径,而是将文件放在配方所在目录的`files`子目录中。 6. **多个文件冲突**:如果有多个同名的文件位于不同的路径,Yocto可能会优先使用其中一个而忽略其他,导致找不到文件。 解决方案步骤: 步骤1:确认文件位置 - 首先找到gstreamer1.0-plugins-base的配方(recipe)。通常,这个配方的名称类似于`gstreamer1.0-plugins-base_1.16.2.bb`。 - 在配方所在的目录下,应该有一个名为`files`的目录,并且`gst-plugins-base-1.16.2.tar.xz`文件应该位于该目录中。 步骤2:检查SRC_URI - 打开配方文件,查看`SRC_URI`变量是否包含了对该文件的引用。它应该包含类似于: ``` SRC_URI = " \ http://gstreamer.freedesktop.org/src/gst-plugins-base/gst-plugins-base-${PV}.tar.xz \ file://gst-plugins-base-1.16.2.tar.xz \ " ``` 注意:这里可能同时指定了多个来源,包括网络下载和本地文件。但通常,我们不会同时指定同一个文件的不同来源(除非有补丁等)。实际上,这里可能只需要网络下载,而不需要本地文件。所以,如果配方中同时指定了网络和本地文件,可能会导致冲突。 步骤3:检查文件是否存在 - 进入配方所在目录的`files`子目录,确认`gst-plugins-base-1.16.2.tar.xz`文件是否存在。 - 如果没有,需要将文件放入该目录,或者修改`SRC_URI`指向正确的路径。 步骤4:检查构建环境的下载目录(DL_DIR) - 有时,即使使用`file://`,Yocto也会尝试将文件复制到下载目录(DL_DIR)。检查下载目录中是否有该文件。如果之前构建失败,可能会导致下载目录中的文件不完整,可以尝试删除下载目录中的该文件,让Yocto重新复制。 步骤5:检查构建日志 - 查看失败任务的日志,通常在`tmp/work/.../temp/log.do_fetch`。日志会显示搜索文件的具体路径,以及为什么没有找到。 步骤6:调整文件搜索路径 - 如果文件不在默认的`files`子目录中,可以在配方中添加一行来扩展`FILESEXTRAPATHS`。例如: ``` FILESEXTRAPATHS_prepend := "${THISDIR}/files:" ``` 这将把当前配方目录下的`files`子目录添加到文件搜索路径中。 步骤7:检查网络设置 - 查看`local.conf`中是否有设置`BB_NO_NETWORK = "1"`。这个设置会禁止从网络下载,但不会禁止本地文件。不过,为了排除网络设置对整体构建环境的影响,可以尝试将其设为0(如引用[4]中的修改): ``` BB_NO_NETWORK = "0" ``` 然后再次尝试构建。 步骤8:手动获取文件 - 如果文件确实不存在,我们可以手动下载该文件并放到正确的位置。根据引用[2],我们可以从https://gstreamer.freedesktop.org/src/下载对应版本的源码包。 具体操作: 1. 下载源码包: ``` wget https://gstreamer.freedesktop.org/src/gst-plugins-base/gst-plugins-base-1.16.2.tar.xz ``` 2. 将下载的文件放入配方目录的`files`子目录中(如果没有则创建)。 3. 重新运行构建。 如果问题仍然存在,我们可以尝试清理状态并重新构建: ``` bitbake -c cleansstate gstreamer1.0-plugins-base bitbake gstreamer1.0-plugins-base ``` 注意:如果配方中同时指定了网络下载(如`http://`)和本地文件(`file://`),那么Yocto会尝试多个来源。如果网络下载失败,它会尝试本地文件。但这里错误是找不到本地文件,所以可能是本地文件没有正确放置。 根据引用[2]和引用[3],我们也可以考虑使用系统包管理器安装Gstreamer开发包,但对于Yocto构建,我们是要为目标设备构建,所以必须使用Yocto的构建系统。 总结:重点检查文件是否在正确位置,以及配方的`SRC_URI`是否设置正确。 相关问题: 1. Yocto构建中如何管理本地源文件(file://)? 2. 如何为Yocto配方添加自定义补丁或文件? 3. Yocto构建中`do_fetch`任务的工作原理是什么? 4. 如何设置Yocto构建系统使用代理下载文件? </think>### 解决 `gstreamer1.0-plugins-base-1.16.2-r0` do_fetch 阶段文件获取问题 #### 问题原因分析 `do_fetch`阶段无法获取 `file://gst-plugins-base-1.16.2.tar.xz` 文件,通常由以下原因引起: 1. **本地文件路径错误**:Yocto 在 `FILESPATH` 指定路径中找不到文件 2. **源码包缺失**:所需的 `tar.xz` 文件未正确放置或下载 3. **网络访问限制**:`BB_NO_NETWORK=1` 设置阻塞备用下载源[^4] 4. **权限问题**:构建用户无权访问文件目录 #### 解决方案步骤 ##### 1. **验证源码包位置** 检查文件是否在正确路径(默认位置): ```bash ls ${TINA_TOPDIR}/repo/dl/gst-plugins-base-1.16.2.tar.xz ``` 若文件不存在: ```bash wget https://gstreamer.freedesktop.org/src/gst-plugins-base/gst-plugins-base-1.16.2.tar.xz \ -P ${TINA_TOPDIR}/repo/dl/ ``` ##### 2. **配置本地文件路径** 在 `conf/local.conf` 添加显式路径声明: ```conf # 添加本地文件搜索路径 FILESEXTRAPATHS_prepend := "${TINA_TOPDIR}/repo/dl:" ``` ##### 3. **启用网络备用下载** 修改网络访问设置(参考引用[4]): ```diff - BB_NO_NETWORK = "1" + BB_NO_NETWORK = "0" ``` 允许在本地文件缺失时从上游下载[^4] ##### 4. **检查文件权限** 确保构建用户有访问权限: ```bash chmod -R u+rw ${TINA_TOPDIR}/repo/dl chown -R $USER:$USER ${TINA_TOPDIR}/repo/dl ``` ##### 5. **清理并重建** 执行完整重建流程: ```bash bitbake -c cleansstate gstreamer1.0-plugins-base bitbake -c fetch gstreamer1.0-plugins-base bitbake gstreamer1.0-plugins-base ``` #### 关键配置说明 ```mermaid graph LR A[do_fetch失败] --> B{检查本地文件} B -->|存在| C[验证路径配置] B -->|不存在| D[下载或放置文件] C --> E[检查FILESEXTRAPATHS] E --> F[检查BB_NO_NETWORK] F -->|=1| G[改为=0] F -->|=0| H[检查文件权限] H --> I[重建任务] ``` #### 验证是否解决 检查 `do_fetch` 日志确认成功: ```bash cat tmp/work/*/gstreamer1.0-plugins-base*/temp/log.do_fetch | grep "Success" # 应显示:Successfully extracted /path/to/gst-plugins-base-1.16.2.tar.xz ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值