gpt4 book ai didi

python - 在 Google Cloud Functions 上执行 shell 脚本

转载 作者:行者123 更新时间:2023-12-04 22:54:55 24 4
gpt4 key购买 nike

我正在尝试使用 FFmpeg 将 .mp4 视频编码为 hls。
我正在使用 subprocess调用 FFmpeg:

def transcoder(data, context):
"""Background Cloud Function to be triggered by Cloud Storage.
This generic function logs relevant data when a file is changed.

Args:
data (dict): The Cloud Functions event payload.
context (google.cloud.functions.Context): Metadata of triggering event.
Returns:
None; the output is written to Stackdriver Logging
"""
try:
input_filename = data['name'].split('/')[-1] #videos have no extension
input_path = f'/tmp/{input_filename}'
print(f'filename {input_filename}')
print(f'input_path {input_path}')
print(f"bucket {data['bucket']}")
print(f"name {data['name']}")

outdir_path = f'/tmp/output/{input_filename}'
os.makedirs(outdir_path, exist_ok=True)

bucket = client.get_bucket(data['bucket'])
blob = bucket.get_blob(data['name'])
blob.download_to_filename(input_path)

cmd = f'''ffmpeg -y -i {input_path} \
-preset ultrafast -g 60 -sc_threshold 0 \
-map 0:0 -map 0:1 -map 0:0 -map 0:1 \
-s:v:0 360x640 -c:v:0 libx264 -b:v:0 365k \
-s:v:1 720x1280 -c:v:1 libx264 -b:v:1 3000k \
-c:a copy \
-var_stream_map "v:0,a:0 v:1,a:1" \
-master_pl_name master.m3u8 \
-f hls -hls_time 6 -hls_list_size 0 \
-hls_segment_filename "{outdir_path}/%v_fileSequence%d.ts" \
-hls_playlist_type vod \
{outdir_path}/%v_prog_index.m3u8'''

process = subprocess.Popen(cmd)
stdout, stderr = process.communicate()
upload_local_directory_to_gcs(outdir_path, upload_bucket, input_filename)
except Exception as e:
print(e)
问题是我得到一个错误:
[Errno 2] No such file or directory: 'ffmpeg -y -i /tmp/video -preset ultrafast -g 60 -sc_threshold 0 -map 0:0 -map 0:1 -map 0:0 -map 0:1 -s:v:0 360x640 -c:v:0 libx264 -b:v:0 365k -s:v:1 720x1280 -c:v:1 libx264 -b:v:1 3000k -c:a copy -var_stream_map "v:0,a:0 v:1,a:1" -master_pl_name master.m3u8 -f hls -hls_time 6 -hls_list_size 0 -hls_segment_filename "/tmp/output/video/%v_fileSequence%d.ts" -hls_playlist_type vod /tmp/output/video/%v_prog_index.m3u8': 'ffmpeg -y -i /tmp/video -preset ultrafast -g 60 -sc_threshold 0 -map 0:0 -map 0:1 -map 0:0 -map 0:1 -s:v:0 360x640 -c:v:0 libx264 -b:v:0 365k -s:v:1 720x1280 -c:v:1 libx264 -b:v:1 3000k -c:a copy -var_stream_map "v:0,a:0 v:1,a:1" -master_pl_name master.m3u8 -f hls -hls_time 6 -hls_list_size 0 -hls_segment_filename "/tmp/output/video/%v_fileSequence%d.ts" -hls_playlist_type vod /tmp/output/video/%v_prog_index.m3u8'
但我知道输入文件和输出文件确实存在,因为我使用 print(os.listdir(path)) 进行了调试。所以现在我想知道我用 subprocess 调用的 FFmpeg 是否可以访问/tmp 文件夹..?
我知道有一个我可以使用的 Python FFmpeg 库,但我不知道如何使用该库运行我的 FFmpeg 命令。你能帮我吗?
p.s.我可以成功地在本地运行它。

最佳答案

发生此错误是因为您应该拆分命令。 subprocess docs

from subprocess import Popen

# working fine
Popen('ffmpeg')

# crashing
Popen('ffmpeg -h')

# working fine
Popen('ffmpeg -h'.split())
小心, "v:0,a:0 v:1,a:1"这不会按预期解析,您需要手动拆分命令。

关于python - 在 Google Cloud Functions 上执行 shell 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62817664/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com