我需要在 shellscript 中使用 ffmpeg 命令
该命令是下一个
(ffmpeg -hide_banner -hwaccel cuvid -c:v h264_cuvid -f hls -i $(youtube-dl -f 95 -g $ylink) -c:v h264_nvenc -r 50 -c:a pcm_s16le -ac 2 -ar 48000 -f hls -hls_list_size 0 /home/build/MSS-ONE/temp/cache/project-$intnumber/$project.m3u8 2>/home/build/MSS-ONE/temp/logs/$project-$intnumber/$project-$intnumber-cache.log) &
我需要获取带引号的嵌入命令的结果$(youtube-dl -f 95 -g $ylink)
,因此 shellscript 中的结果必须是这样的
ffmpeg -hide_banner -hwaccel cuvid -c:v h264_cuvid -f hls -i "https://manifest.googlevideo.com/api/manifest/hls_playlist/expire/1566607293/ei/XTNgXdq4B8O-gwP_7Kn4CA/ip/158.50.77.241/id/-1xif50QMr4.365/itag/95/source/yt_live_broadcast/requiressl/yes/ratebypass/yes/live/1/goi/160/sgoap/gir%3Dyes%3Bitag%3D140/sgovp/gir%3Dyes%3Bitag%3D136/hls_chunk_host/r2---sn-p5qs7nek.googlevideo.com/playlist_type/DVR/initcwndbps/6590/mm/44/mn/sn-p5qs7nek/ms/lva/mv/m/mvi/1/pl/20/dover/11/keepalive/yes/beids/9466588/mt/1566585624/disable_polymer/true/sparams/expire,ei,ip,id,itag,source,requiressl,ratebypass,live,goi,sgoap,sgovp,playlist_type/sig/ALgxI2wwRQIhANz10pUs-d4j0UXRSjzBYPXfyX4ud8mJMMbr9atpDZK_AiBzHkWNXpg2ALK0mnAZPiF_c_U6wQ6Kl5sIUwPlFoNm1A%3D%3D/lsparams/hls_chunk_host,initcwndbps,mm,mn,ms,mv,mvi,pl/lsig/AHylml4wRAIgddN210SkarxEUx0auCxF6miMbA4XLtVo9-G89HDI8bYCIGraEMZ7VL9cvMLlVKifc5pVB6EbAOq8-PqmMES4dpWG/playlist/index.m3u8" -c:v h264_nvenc -r 50 -c:a pcm_s16le -ac 2 -ar 48000 -f hls -hls_list_size 0 /home/build/MSS-ONE/temp/cache/TN-4474fe64/TN.m3u8
我不知道该怎么做。
有人能帮我吗?
提前致谢。
不,不起作用,用双引号将其发送到控制台
ffmpeg -hide_banner -hwaccel cuvid -c:v h264_cuvid -f hls -i https://manifest.googlevideo.com/api/manifest/hls_playlist/expire/1566609044/ei/NDpgXer1Htnlhwa4vp-oDg/ip/158.50.77.241/id/-1xif50QMr4.365/itag/95/source/yt_live_broadcast/requiressl/yes/ratebypass/yes/live/1/goi/160/sgoap/gir%3Dyes%3Bitag%3D140/sgovp/gir%3Dyes%3Bitag%3D136/hls_chunk_host/r2---sn-p5qlsndz.googlevideo.com/playlist_type/DVR/initcwndbps/4760/mm/44/mn/sn-p5qlsndz/ms/lva/mv/m/mvi/1/pl/20/dover/11/keepalive/yes/beids/23806817/mt/1566587361/disable_polymer/true/sparams/expire,ei,ip,id,itag,source,requiressl,ratebypass,live,goi,sgoap,sgovp,playlist_type/sig/ALgxI2wwRQIhANzUWftly6fgAs-gftCO1M43sYH0onbO_bUDKNzspTkgAiB6V595Uxr0lfPVvyziI-goB5l547cW9JVqQ39qtOLjJw%3D%3D/lsparams/hls_chunk_host,initcwndbps,mm,mn,ms,mv,mvi,pl/lsig/AHylml4wRQIgaTR8rH6lv5snP84oaRxyDHbN2CYKc-A03aQSGHpZRs4CIQDzZdGeSXbcdm9OGethv32zwX4rvzHB7saxdrAiIXNWng%3D%3D/playlist/index.m3u8 -c:v h264_nvenc -r 50 -c:a pcm_s16le -ac 2 -ar 48000 -f hls -hls_list_size 0 /home/build/MSS-ONE/temp/cache/TN-c21df74c/TN.m3u8
您可以看到引号不在命令中。
编辑:
我按照 chamorros 的建议进行了测试并得到了一些消息,它在控制台中有效,但在 shellscript 中无效(我不知道为什么)。
#!/bin/bash
read -p "Project Name: " project
read -p "Enter Youtube Link Name: " ylink
intnumber=$(cat /dev/urandom | tr -cd 'a-f0-9' | head -c 8)
hlslink=$(echo \"$(youtube-dl -f 95 -g $ylink)\")
ffmpeg -hide_banner -hwaccel cuvid -c:v h264_cuvid -f hls -i $hlslink -c:v h264_nvenc -r 50 -c:a pcm_s16le -ac 2 -ar 48000 -f hls -hls_list_size 0 /home/build/MSS-ONE/temp/cache/$project-$intnumber/$project.m3u8
这给了我一个错误的说法“没有这样的文件或目录”。
我认为问题出在 ffmpeg 和变量上。
感谢您的尝试。
答案1
您只需将命令替换括在双引号中:
… -i "$(youtube-dl -f 95 -g $ylink)" -c:v …
正如我在这个答案, 双引号不保留 的字面值$
,因此尽管命令被引用,但命令替换仍会被评估。单引号的情况并非如此 - 让我们看一个简单的例子:
$ echo "$(whoami)"
dessert
$ echo '$(whoami)'
$(whoami)
在第一种情况下,使用双引号,将评估命令替换并echo
打印我的用户名dessert
;在第二种情况下,使用单引号,将不评估命令替换,并且按原样打印字符串。
当我跑步时youtube-dl -f 95 -g
点击 YouTube 视频链接,我得到了以下信息:
ERROR: requested format not available
您可以为此添加测试,例如:
if ! hlslink=$(youtube-dl -gf22 "$file"); then
exit
fi
ffmpeg … -i "$hlslink" …
这将设置hlslink
变量,如果不成功,则退出脚本。我没有添加错误消息,因为打印youtube-dl
出来的消息已经很好了。