AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题

问题[ffmpeg](unix)

Martin Hope
Stewart
Asked: 2025-02-17 21:40:11 +0800 CST

ffmpeg 为多个本地零延迟读取器分割流

  • 6

我正在使用 ffmpeg 从四输入捕获卡读取,并输出 3 个同时的流:

  • HDMI1+2 覆盖 -> rtsp://localhost:5545/hud1
  • HDMI1+3 覆盖 -> rtsp://localhost:5545/hud2
  • 仅 HDMI1 -> rtsp://localhost:5545/vis

在此处输入图片描述

这个输入1+2命令花了一些时间,但效果很好。

SOURCE1=(-f decklink -i 'DeckLink Quad HDMI Recorder (1)')
SOURCE2=(-f decklink -i 'DeckLink Quad HDMI Recorder (2)')

# Scale inputs, and transpose black pixels to alpha on the overlay
FILTER=(-filter_complex "
  [0:v]scale=960:540[base];
  [1:v]scale=540:540,colorkey=black:0.1:0.1[overlay];
  [base][overlay]overlay=(W-w)/2:(H-h)/2
")

ENCODING_OPTIONS=(
  -c:v libx264  # x264 codec
  -preset fast  # Balances latency, quality, bandwidth
  -crf 18       # 18 = visually lossless. That's good enough
  -an           # Strip out audio
) 

STREAMING_OPTIONS=(
  -b:v 5000k      # Target 5000 kbps bitrate
  -maxrate 5500k  # Should be a little higher than target to allow catchup
  -bufsize 4000k  # Bigger buffer is better for stability but reduces latency
  -r30            # Don't need 60fps, 
  -tune zerolatency
)

SINK=(-f rtsp rtsp://localhost:5545/hud1)

ffmpeg \
  "${SOURCE1[@]}" \
  "${SOURCE2[@]}" \
  "${FILTER[@]}" \
  "${ENCODING_OPTIONS[@]}" \
  "${STREAMING_OPTIONS[@]}" \
  "${SINK[@]}"

问题:

驱动程序不允许两个 ffmpeg 实例监听同一个频道。如果我运行 HDMI1+2,然后尝试仅传输 HDMI1,我会得到:

Error opening input: Input/output error
Error opening input file DeckLink Quad HDMI Recorder (1)

尝试 1:环回 RTSP:

如果我先运行“仅输入 1”,然后使用运行和 ,它确实可以工作。但是,在我的配置下,每次 RTSP 跳转都会增加约 2 秒的延迟。这意味着输入 1 比覆盖延迟约 2 秒。SOURCE1=(-i rtsp://localhost/base)Input 1+2Input 1+3

在此处输入图片描述

尝试 2:/dev/shm

我尝试将“仅输入 1”输出到SINK=(-f shm /dev/shm/base),希望从 Input1+2 和 Input1+3 流中读取该内容。我希望将其保留在本地可以消除延迟。

Requested output format 'shm' is not known.

在此处输入图片描述

尝试 3:unix://

SINK=(-f mpegts -listen 1 unix:/run/user/1000/base.socket)我尝试通过设置来使用unix 域套接字SOURCE1=(-i unix:/run/user/1000/base.socket),但最终得到:

Unable to choose an output format for 'unix:/run/user/1000/base.socket'; use a standard extension for the filename or specify the format manually.

所以我尝试使用不同的扩展:

SINK=(-f mpegts -listen 1 unix:/run/user/1000/base.mkv)

但是当我尝试用 Input1+2 读取它时,我得到:

Could not find codec parameters for stream 1 ...: unspecified frame size
...
Output file does not contain any stream

尝试#4:一体化:

在此处输入图片描述

我觉得这可能是解决方案,但还不够。我尝试使用split=3过滤器和-map功能在一个 ffmpeg 实例中完成所有操作,但当基础图像上有覆盖层时,其分辨率要差得多。我不确定我的流媒体选项是每个流的还是在所有三个流之间共享的。

VISUAL_SOURCE=(-f decklink -i 'DeckLink Quad HDMI Recorder (1)' )
HUD1_SOURCE=(  -f decklink -i 'DeckLink Quad HDMI Recorder (2)' )
HUD2_SOURCE=(  -f decklink -i 'DeckLink Quad HDMI Recorder (3)' )

FILTER_PAIR=(-filter_complex "
    [0:v]scale=960:540,split=3[vis0][vis1][vis2];
    [1:v]scale=540:540,colorkey=black:0.1:0.1[hud1];
    [2:v]scale=540:540,colorkey=black:0.1:0.1[hud2];
    [vis1][hud1]overlay=(W-w)/2:(H-h)/2[hud1overlay];
    [vis2][hud2]overlay=(W-w)/2:(H-h)/2[hud2overlay]
")

ENCODING_OPTIONS=(
  -c:v libx264
  -preset fast
  -crf 18
  -an
)

STREAMING_OPTIONS=(
  -b:v 5000k
  -maxrate 5500k   
  -bufsize 4000k   
  -r 30            
  -tune zerolatency
  -xerror          
)

SINK1=(-map '[vis0]'        -f rtsp rtsp://localhost:5545/vis)
SINK2=(-map '[hud1overlay]' -f rtsp rtsp://localhost:5545/hud1)
SINK3=(-map '[hud2overlay]' -f rtsp rtsp://localhost:5545/hud2)

ffmpeg \
  "${VISUAL_SOURCE[@]}" \
  "${HUD1_SOURCE[@]}" \
  "${HUD2_SOURCE[@]}" \
  "${FILTER_PAIR[@]}" \
  "${ENCODING_OPTIONS[@]}" \
  "${STREAMING_OPTIONS[@]}" \
  "${SINK1[@]}" \
  "${SINK2[@]}" \
  "${SINK3[@]}"

第一个输出rtsp://.../base(原始 SOURCE1)看起来很棒(类似于我原来只有 2 个输入和一个输出的尝试),但是rtsp://.../hud1(rtsp://.../hud2SOURCE 2/3 除以 SOURCE 1)的分辨率很差。

ffmpeg
  • 1 个回答
  • 15 Views
Martin Hope
Alain Reve
Asked: 2025-02-10 01:50:51 +0800 CST

如何将动画 gif 转换为单独的帧,然后再转换回动画 gif?

  • 7

我想手动修改动画 gif。因此,我尝试将其转换为单个(可编辑)帧,然后绘制修改内容,然后重新组装这些帧。

首先,我将 31 秒长的 mp4 转换为动画 gif:

ffmpeg   -i Daisies.mp4   -r 15   -vf scale=512:-1   -ss 00:00:03 -to 00:00:06   DaisiesOK.gif

这个动图还可以。

然后我将此动画 gif 转换为单独的帧:

convert DaisiesOK.gif Daisies.png

第一帧看起来还好,除了它是 256 种颜色,但接下来的帧非常苍白,充满了透明像素。

这些帧转换为动画 gif:

convert -delay 20 -loop 0 *.png Daisies.gif

给出了非常丑陋的视频,雏菊有白色的“阴影”,它们开始的地方(它们摇摆)留下了白色雏菊边缘的印记。

如果我尝试使用 jpeg 而不是 png,情况会更糟,大部分视频都只是黑色。

我如何提取保留所有颜色信息的帧?问题出在 imagemagick 还是 ffmpeg?

ffmpeg
  • 2 个回答
  • 578 Views
Martin Hope
Codemonkey
Asked: 2025-01-25 17:06:44 +0800 CST

我可以让叠加的 png 水印随着时间而旋转吗?

  • 5

我目前有一个水印在视频中跳来跳去,里面有一段可怕的代码filter_complex

overlay=x='if(gte(mod(t*100, (W-w)*2), W-w), (W-w)*2 - mod(t*100, (W-w)*2), mod(t*100, (W-w)*2))'
       :y='if(gte(mod(t*100, (H-h)*2), H-h), (H-h)*2 - mod(t*100, (H-h)*2), mod(t*100, (H-h)*2))'

我也想让它随着时间旋转。

我发现当我定义覆盖元素时,我可以应用“rotate = 2”或其他任何方法将其旋转一次,并且它在弹跳时会保持原样。

如果我尝试rotate='PI*t'它什么也不做(但令人惊讶的是它没有给我一个关于 的错误t)。我想我并不惊讶它不起作用,但我很惊讶它没有抱怨我的t。

如果我尝试在同一个部分中添加rotate='PI*t'我告诉覆盖的内容x和y要具有的内容(我可能期望它工作的位置,因为t在那里可以清楚地理解),它确实会出错 -Option 'rotate' not found

这是否可以在 ffmpeg 命令中执行,或者我是否需要制作动画 apng/avif 水印文件?

(我使用的是相对较旧的 ffmpeg 版本,5.1.6。如果迁移到较新版本比较容易,我很乐意这样做 - 我正在运行 CentOS Stream 9。)

编辑

这就是我现在正在尝试的@Gyan

ffmpeg
-y
-i input.mp4
-loop 1 -i logo.png
-filter_complex "
    [0:v]
        scale=960:540[video];
    [1]
        scale=100:-1,colorchannelmixer=aa=0.6,rotate=a='PI/50*t':fillcolor=none[logo];
    [video][logo]
        overlay=x='if(gte(mod(t*100, (W-w)*2), W-w), (W-w)*2 - mod(t*100, (W-w)*2), mod(t*100, (W-w)*2))'
               :y='if(gte(mod(t*100, (H-h)*2), H-h), (H-h)*2 - mod(t*100, (H-h)*2), mod(t*100, (H-h)*2))'
"
-c:a aac
-c:v libx264
output.mp4

如果没有这个-loop 1,这需要 1-2 秒。有了它,我厌倦了,并ctrl-C在 30 秒后完成了它。

编辑二

好的,我删除了-loop 1并将相关行更改为

[1]loop=100:1:0,scale=100:-1,colorchannelmixer=aa=0.6,rotate=a='PI/5*t':ow=iw*1.5:oh=ih*1.5:fillcolor=none[logo];

这似乎做得很好。但只适用于 100 帧。如果我把它放在-1那里,它似乎会生成一个无限流,而不是匹配 input.mp4 的长度。我认为答案涉及关键字,但我不完全确定它应该放在哪里?之前shortest将它作为选项添加没有用。-shortestoutput.mp4

附加问题:图像旋转时,周围出现了白色圆形条纹,如何修复?

我做错什么了?

谢谢你!

ffmpeg
  • 1 个回答
  • 49 Views
Martin Hope
Gary U.U. Unixuser
Asked: 2024-11-11 06:33:34 +0800 CST

如何使用 ffmpeg 同时修剪开头和淡入

  • 5

使用 ffmpeg,有关于如何修剪或如何淡入的建议,但如何在一个命令中完成这两项操作?

视频应在 00:10:07 开始为黑色,并淡入 1 秒,因此在 00:10:08 时它应该完全可见。

  1. 可以同时进行修剪和淡入吗?
  2. 我可以先测试运行它吗(对于大型视频文件,这需要几个小时)。ffplay 的工作方式与 ffmpeg 略有不同。
  3. 最后是否可以做类似的事情(从 01:28:57 开始淡入淡出,持续 1 秒,然后忽略其余部分)?

谢谢您的帮助!

加里

ffmpeg
  • 1 个回答
  • 29 Views
Martin Hope
jsx97
Asked: 2024-06-14 15:57:40 +0800 CST

FFmpeg:选项“to”的工作方式因放置位置不同而不同。为什么会这样?

  • 5

有人能解释一下为什么

ffmpeg -i input.mov -ss 00:00:10 -to 00:00:15 output1.mov

制作一段 5 秒的视频,从第 10 秒到第 15 秒,而

ffmpeg -ss 00:00:10 -i input.mov -to 00:00:15 output2.mov

制作一个15秒的视频,从第10秒到第25秒?

ffmpeg
  • 1 个回答
  • 32 Views
Martin Hope
jsx97
Asked: 2024-06-11 23:35:17 +0800 CST

使用 FFmpeg 修剪视频导致黑屏

  • 5

我尝试弄清楚如何使用 FFmpeg 修剪视频。我.mov使用 Apple 的 QuickTime 播放器创建了一个 30 秒的屏幕截图,然后尝试使用三种不同的方式对其进行修剪:

  1. 使用-copyts,无需重新编码

    ffmpeg -copyts -ss 00:00:10 -i input.mov -to 00:00:15 -map 0 -c copy output.mov
    
  2. 使用-copyts,并重新编码

    ffmpeg -copyts -ss 00:00:10 -i input.mov -to 00:00:15 -c:v libx264 -crf 23 -c:a aac -b:a 192k output.mov
    
  3. 使用-trim(重新编码,这是唯一的选择):

    ffmpeg -i input.mov -vf trim=10:15 output.mov
    

无论我尝试哪种方法,输出的视频总是 15 秒长,其中前 10 秒只是黑屏,而我预期的是 5 秒的视频,并且没有黑屏。

这三个解决方案都来自这里:https://superuser.com/questions/377343/cut-part-from-video-file-from-start-position-to-end-position-with-ffmpeg(@slhck和@malat的回答),并且投票率很高,所以我以为它们应该可以正常工作,但事实并非如此。这是为什么?命令有问题,还是视频有问题?

视频上传到这里:https://github.com/jsx97/test/blob/main/input.mov

ffmpeg
  • 1 个回答
  • 56 Views
Martin Hope
xralf
Asked: 2024-03-21 03:58:10 +0800 CST

将 swf 文件转换为 mp4

  • 5

我偶然发现了这个不错的网站。有swf和mp3文件。我想将它们转换为mp4其他内容,以便可以查看。

我尝试过gnash但ffmpeg没有成功。

我上线了Lubuntu 22.04

ffmpeg
  • 1 个回答
  • 106 Views
Martin Hope
xralf
Asked: 2024-02-25 19:08:27 +0800 CST

ffmpeg:加载共享库时出错:libavdevice.so.58:无法打开共享对象文件:错误 74

  • 5

从今天开始,当我运行时,ffmpeg我在这个问题的标题中出现了错误。

我尝试了这个,但无法应用该解决方案,因为我有一个目录/etc/ld.so.conf.d,并且该目录中有以下文件: fakeroot-x86_64-linux-gnu.conf i386-linux-gnu.conf libc.conf x86_64-linux-gnu.conf

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 22.04.4 LTS
Release:    22.04
Codename:   jammy
ffmpeg
  • 1 个回答
  • 37 Views
Martin Hope
nonreligious
Asked: 2024-02-06 18:39:48 +0800 CST

使用“xautolock”运行脚本,解锁后使用“ffmpeg”捕获图像

  • 5

我正在使用i3wm,并且希望在解锁屏幕后运行脚本。当我手动锁定屏幕时,我可以让它工作,例如使用本文中概述的步骤 。

但在我的屏幕自动解锁后,我无法让它工作,例如通过xautolock. 例如,

xautolock -time 5 -locker "blurlock -n && my_script.sh"

不起作用 – 5 分钟后屏幕锁定,但解锁后脚本不运行。事实上,它似乎根本没有运行。

有什么方法可以让它发挥作用吗?也许使用xss-lock或类似?

编辑

根据评论中@aviro的建议,我将脚本更改为

#!/usr/bin/bash
echo "Hello" >> $HOME/temp.txt
blurlock -n
echo "Unlocked" >> $HOME/temp.txt

然后就跑了xautolock -time 1 -locker "my_script.sh &"。屏幕锁定,文件temp.txt包含脚本中的两行。因此,在xautolock.

我希望我的脚本执行的部分操作是通过ffmpeg. 我将脚本更改为以下内容:

#!/usr/bin/bash
blurlock -n 
ffmpeg -f video4linux2 -s vga -i /dev/video-cam $HOME/Pictures/test.jpg 
notify-send -t 30000  'Unlocked'

这在手动运行时有效 - 屏幕被锁定,解锁后会弹出一条通知,显示“已解锁”,并且来自网络摄像头的图像将按照指定写入到文件中。

但通过 运行时xautolock -locker "my_script.sh",解锁后,没有图像捕获或通知。由于我xautolock从终端运行(并将其发送到后台&),我收到以下消息

[1]  + 581665 suspended (tty output)  xautolock -time 1 -locker "my_script.sh"

添加> /dev/null 2>&1到ffmpeg命令也没有帮助。

ffmpeg
  • 1 个回答
  • 53 Views
Martin Hope
Francesco Galgani
Asked: 2023-03-26 21:43:06 +0800 CST

在 Youtube 上流式传输时的 ffmpeg“-pix_fmt yuv420p”选项

  • 5

官方教程https://trac.ffmpeg.org/wiki/StreamingGuide使用该-pix_fmt yuv420p选项。

我也使用它,从教程中复制它,并从 FFmpeg 流式传输到 Youtube 对我有用。但是,尚不清楚它的用途,尤其是它是否是 Youtube 的必要选项,或者是否有更好的选项。

关于这个主题的 Youtube 文档似乎没有涵盖这一点,或者可能涵盖了但我不明白在哪里: https: //support.google.com/youtube/answer/1722171 ?hl= en。

有谁知道这方面的任何准确文件?

ffmpeg
  • 2 个回答
  • 27 Views

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve