如何通过 .sh 或 Python 脚本使用 pipe:///,或者使用 FFMPEG 中的某种设置文件

如何通过 .sh 或 Python 脚本使用 pipe:///,或者使用 FFMPEG 中的某种设置文件

第一次发帖,请多多包涵 :)

简单介绍一下历史。我使用的是 tvheadend,内置转码器会消耗我的 CPU,并提供平均质量的输出(由 ffmpeg 提供支持),如果我将 tvheadend 的输出通过 ffmpeg 传输,我会获得更低的 CPU 使用率和更好的质量(很奇怪但确实如此)。(由于播放器功能有限,我不得不进行转码)

因此,在 tvheadend 中,http 链接来自类似

http://avideostream

pipe:///usr/bin/ffmpeg -loglevel fatal -i http://avideostream -tune zerolatency -vcodec libx264 -preset veryfast -crf 28 -maxrate 1200k -bufsize 3500k -vf "scale='min(1280,iw)':'min(720,ih)'" -acodec aac -b:a 128K -f mpegts pipe:1

正如您所见,有很大差异。

这一切都有效,但是如果我想更改上述管道中的设置,我必须为所有链接更改它们(我通过脚本进行),但这意味着 tvheadend 重新导入并测试所有链接(因为它将它们视为已更改的链接,这很公平)。

所以我想要做的是将 ffmpeg 包装在某个东西中,这样我就可以更改包装器。(这一切都发生在最新的 ubuntu 服务器上)。

现在我可以很高兴地说我不是 Ubuntu 专家(甚至还差得远),尽管我已经运行自己的家庭服务器几年了。所以我并不完全了解“管道”的所有方面。

我看到的上述三个选项(到目前为止,我还没有找到为 tvheadend 选择外部转码器选项的方法,除非进入奇怪的构建,这是我想避免的)是:

对 ffmpeg 使用外部选项文件(我可以从控制台开始工作,但不能作为管道的一部分,例如 sudo ffmpeg -i amovie.mp4 $(cat ffmpegoptions.txt) convertmovie.mp4,它可能像文件访问权限一样简单,但我没有做太多调试)

将 ffmpeg 的内容放入 .sh 文件中(但这似乎会破坏管道,我甚至不知道从哪里开始)

将 ffmpeg 放入某种 python 脚本中(我甚至没有开始研究这个,这对我来说太过分了,我可以编写 python,但这目前超出了我的能力范围)

简短的版本,我想从以下开始:

tvheadend >> 通过管道传输到 ffmpeg >> 返回到 tvheadend >> 关闭到播放器

要么

tvheadend >> 通过管道传输到 .sh 或脚本包装器 >> 通过管道传输到 ffmpeg >> 返回到 tvheadend >> 关闭到播放器

或者

tvheadend >> 通过管道传输到 ffmpeg(由外部选项文件控制)>> 返回 tvheadend >> 关闭到播放器

任何建议/帮助都将不胜感激。如果我遗漏了任何重要信息,请告诉我。

答案1

我没有找到真正的答案,更多的是解决方法。由于这都是更大、更复杂的 plex 的一部分,我找到了一个代理(希特夫),其中包括 ffmpeg 转码,我可以设置 ffmpeg 的选项。这对于我想要做的事情来说已经足够好了。

希望这可以为别人节省一点时间。

答案2

关于将 ffmpeg 内容放入 .sh 文件中,我假设您将 pipe:/// 字符串放在 mux URL: 文本框中。在这种情况下,要调用脚本,您只需执行以下操作:

pipe:///path/to/script/yourscriptname.sh

然后在脚本中运行您想要的任何命令,最后执行的命令是将您的 ffmpeg 调用括在括号中,并在开头使用 ffmpeg 的完整路径而不是 pipe:///,在您的情况下,脚本中的最后一行可能是这样的:

(/usr/bin/ffmpeg -loglevel fatal -i http://avideostream -tune zerolatency -vcodec libx264 -preset veryfast -crf 28 -maxrate 1200k -bufsize 3500k -vf“scale='min(1280,iw)':'min(720,ih)'”-acodec aac -b:a 128K -f mpegts pipe:1)

需要注意的一点是,一旦脚本调用了 ffmpeg,脚本实际上就失去了控制权 - ffmpeg 调用之后的任何内容都不会执行。但是,您可以使用条件(例如 if - elif - else 等)来选择要执行的特定版本的 ffmpeg 命令,因为脚本只有在调用 ffmpeg 后才会失去控制权。因此,虽然您的 ffmpeg 调用不一定是脚本中的最后一行,但一旦调用了 ffmpeg,脚本就完成了,无论这是否是您的意图!

相关内容