使用youtube-dl,ffmpeg&创建PowerShell Streamer功能ffplay

时间:2017-07-11 02:01:47

标签: bash powershell video ffmpeg youtube

我的问题是将youtube-dl,ffmpeg,ffplay和PowerShell结合起来处理视频网址。

我见过的一些示例已经使用Windows命令提示符将来自youtube-dl的二进制流传输到外部播放器,如下所示:

youtube-dl --output - "https://youtube.com/mygroovycontent" | mpc-hc.exe /play /close -

这在命令提示符中工作正常,因为它不会破坏二进制流。如果您尝试在PowerShell中运行相同的命令,它就不能很好地处理二进制流并修改输出,使外部播放器无法读取。

鉴于此,我已编写以下PowerShell函数来解决此问题。它试图反映我用Bash写的类似函数(参见:https://github.com/adamchilcott/.dotfiles/blob/master/.bash_functions.d/streamer.sh

我单独处理youtube-dl,ffmpeg和ffplay的原因是在youtube-dl中定义ffmpeg二进制位置作为外部程序在PowerShell中传递它时会产生一些问题。

我希望有人可以查看我的脚本并提供一些反馈,说明我在这里做了什么,是否可以改进或者是否已经有更好的实施方案?

最佳,

亚当。

BEGIN POWERSHELL

Function streamer
{

Param
(
[string] $streamURL
)

Begin
{
}

Process
{
$streamDir = "$env:TEMP\YTD.d"

$ytdBin = "Z:\PortableApps\CommandLineApps\youtube-dl\youtube-dl.exe"
$streamExtractor = &$ytdBin --no-warnings --get-url $streamURL

$ffmpegBin = "Z:\PortableApps\CommandLineApps\ffmpeg-20170702-c885356-win64-static\bin\ffmpeg.exe"
$ffplayBin = "Z:\PortableApps\CommandLineApps\ffmpeg-20170702-c885356-win64-static\bin\ffplay.exe"

if 
(
-not (Test-Path -Path $streamDir -PathType Any)
)

{
New-Item $streamDir -type directory -ErrorAction SilentlyContinue
}

Start-Process -FilePath $ffmpegBin -ArgumentList "-loglevel quiet -i $streamExtractor -c copy $streamDir\streamContainer.m2ts" -NoNewWindow -ErrorAction SilentlyContinue

Do
{
Start-Sleep -Seconds 1
} 

Until 
(
(Get-Item $streamDir\streamContainer.m2ts -ErrorAction SilentlyContinue).Length -gt 256kb
)

&$ffplayBin -loglevel quiet $streamDir\streamContainer.m2ts

if 
(
(Test-Path -Path $streamDir -PathType Any) -eq $true -and (Get-Process -Name ffplay -ErrorAction SilentlyContinue) -eq $null
) 

{

Do
{
Stop-Process -Name ffmpeg -ErrorAction SilentlyContinue
}

Until
(
(Get-Process -Name ffmpeg -ErrorAction SilentlyContinue) -eq $null
)

Remove-Item $streamDir -Recurse -ErrorAction SilentlyContinue
}
}

End
{
}

}

streamer -streamURL https://www.youtube.com/watch?v=9uFXw7vKz14

END POWERSHELL

0 个答案:

没有答案