我的问题是将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