我正在尝试用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))
调试了它,所以现在我想知道我用子进程调用的FFmpeg是否可以访问/tmp文件夹。。?
我知道有一个Python FFmpeg库可以使用,但我不知道如何使用该库运行我的FFmpeg命令。 你能帮忙吗?
附注。 我可以成功地在本地经营。
发生此错误是因为您应该拆分命令。 子流程单据
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”
这将不会按预期进行解析,您将需要手动拆分命令。