首页 > 其他分享 >一个常见的导致ffmpeg滤镜链“Invalid stream specifier”错误的原因

一个常见的导致ffmpeg滤镜链“Invalid stream specifier”错误的原因

时间:2023-10-26 09:56:40浏览次数:41  
标签:specifier right ffmpeg stream 1080 crop scaled mp4 left

如题,这个错误好像特别容易犯,但好像中文互联网上还没有人记录过。故在此简记,为像我一样初学ffmpeg的朋友填个坑。

参考资料:https://video.stackexchange.com/questions/23731/ffmpeg-stream-specifier-matches-no-streams-but-it-exists


目前有一个特别“长”(物理)的视频primary.mp4。我希望将其横向拉长到指定分辨率(6166x1080)后,切出左侧的3840x1080部分和右侧的3840x1080部分,分别输出为left.mp4和right.mp4。遂构造滤镜链:

ffmpeg -i primary.mp4 -filter_complex "[0:v]scale=6166:1080[scaled];[scaled]crop=3840:1080:0:0[left];[scaled]crop=3840:1080:2327:0[right]" -map "[left]" left.mp4 -map "[right]" right.mp4

看一下这个滤镜链可以被整理成如图所示:
image

而执行报错:

[mov,mp4,m4a,3gp,3g2,mj2 @ 000001485bf9e600] Invalid stream specifier: scaled.
    Last message repeated 1 times
Stream specifier 'scaled' in filtergraph description [0:v]scale=6166:1080[scaled];[scaled]crop=3840:1080:0:0[left];[scaled]crop=3840:1080:2327:0[right] matches no streams.

简单来看似乎是流“scaled”没有找到。而其原因相当简单但好像从来没听有人提及过。那就是同一个流(“[scaled]”)不能被重复使用。

当scale滤镜输出流“[scaled]”之后,在后面我们用了这个流两次,分别是切左侧和切右侧视频的crop。而这是不允许的。

也就是说,图上这个位置这样的连接是不允许的

image

那么如何解决呢?答案是用split滤镜将“[scaled]”流给拆成两个“[scaled1]”和“[scaled2]”,再将两个流分别喂给两个crop:

ffmpeg -i primary.mp4 -filter_complex "[0:v]scale=6166:1080[scaled];[scaled]split[scaled1][scaled2];[scaled1]crop=3840:1080:0:0[left];[scaled2]crop=3840:1080:2327:0[right]" -map "[left]" left.mp4 -map "[right]" right.mp4

此外,split滤镜具有一个参数“outputs”。设置该参数为整数数字几就可以让它拆分出多少个流来。

就是这样。

标签:specifier,right,ffmpeg,stream,1080,crop,scaled,mp4,left
From: https://www.cnblogs.com/izwb003/p/ffmpeg_invalid_stream_specifier_maybe_reason.html

相关文章

  • EPOLLOUT只是表示tcp stream是可写入的?
    tcp_poll方法https://elixir.bootlin.com/linux/latest/source/net/ipv4/tcp.c#L553......
  • FFmpeg frei0r插件使用学习
    背景ffmpeg做基本的音视频编辑还是比较简单的,但要做一些滤镜及特效就比较麻烦了。接下来看看借用frei0r插件怎么做;简介你可以将frei0r看作是一个"视频特效工具箱"。比如你有一段视频,你想给它加上某种特殊效果,例如让它变成黑白色,或者添加一个模糊效果,而frei0r就包含了许多这样的......
  • 使用Java 8的Stream API来对集合中的数据根据id去重并且同一个id只取符合条件的那一个
    `ListdataList=newArrayList<>();dataList.add(newData(1,"A"));dataList.add(newData(2,"B"));dataList.add(newData(1,"C"));dataList.add(newData(3,"D"));Map<Integer,Data>filteredMap=d......
  • GraphPrompt: Unifying Pre-Training and Downstream Tasks for Graph Neural Network
    目录概符号说明GraphPrompt代码LiuZ.,YuX.,FangY.andZhangX.GraphPrompt:Unifyingpre-traininganddownstreamtasksforgraphneuralnetworks.WWW,2023.概统一的图预训练模型+Prompt微调.符号说明\(G=(V,E)\),图;\(\mathbf{X}\in\mathbb{R}^{|......
  • mysql 备份文件.xbstream 恢复
    数据库备份文件的恢复1.可通过xtrabackup工具恢复,官方下载地址:https://www.percona.com/downloads/XtraBackup/LATEST/选择对应版本安装注意:要选择和数据库版本对应的工具2.全量恢复#全备文件:full_backup.xbstream#恢复mysql数据文件目录:/rds/mysql#恢复全备xbstream......
  • 知乎 Flink 取代 Spark Streaming 的实战之路
    “数据智能”(DataIntelligence)有一个必须且基础的环节,就是数据仓库的建设,同时,数据仓库也是公司数据发展到一定规模后必然会提供的一种基础服务。从智能商业的角度来讲,数据的结果代表了用户的反馈,获取结果的及时性就显得尤为重要,快速的获取数据反馈能够帮助公司更快的做出决策,......
  • Kth Largest Element in a Stream
    study/javaDesignaclasstofindthe kth largestelementinastream.Notethatitisthe kth largestelementinthesortedorder,notthe kth distinctelement.Implement KthLargest class:KthLargest(intk,int[]nums) Initializestheobjectwith......
  • C++常用语法知识-- std::istringstream
    C++常用语法知识--std::istringstream介绍std::istringstream是C++标准库中的一个类,它用于从字符串中提取数据,并将数据转换为不同的数据类型。通常从字符串中解析数据,例如整数、浮点数等。使用方法创建std::istringstream对象,首先,需要创建一个std::istringstream对象,将......
  • Java基础 FileInputStream 字节输入流的细节
    1.创建字节输入流对象:FileInputStreamfis=newFileInputStream("E:\\Java基础资料\\a.txt");细节:如果文件不存在,就直接报错 2.读取数据(read方法负责读取数据,会一个一个地读,如果读不到了,就会返回-1)细节①:一次读取一个字节,读出来的是数据在ASCII码表上对应的数字细节......
  • CentOS 8 Stream vs Anolis8.8 对比(2023.10)
    硬件环境Honor笔记本电脑,16GRAM,512GSSD,本机自带无线网卡,外接USB有线网卡安装Anolis8.8到一个128GKingstonU盘,出现如下现象显卡驱动无法支持笔记本的外接显示器;中文输入法无法自动工作;内核版本为5.10;本机的无线网卡未自动识别重新安装CentOS8Stream......