2017-10-20 45 views
0

我試圖從python使用ffmpeg。我需要執行的命令是:python中的子進程命令行中沒有反斜槓的引號

ffmpeg -i test_file-1kB.mp4 -i test_file.mp4 -filter_complex psnr="stats_file=test_file.mp4-1kB.psnr" -f null - 

然而,我的輸出,這是獲得傳遞給子看起來是用反斜槓轉義雙引號,像這樣:

In[1]: print(subprocess.list2cmdline(psnr_args)) 
ffmpeg -i test_file-1kB.mp4 -i test_file.mp4 -filter_complex psnr=\"stats_file=test_file.mp4-1kB.psnr\" -f null - 

要使用子,我將我的命令行參數逐個構建到列表中,然後將列表傳遞給子進程。

psnr_args = [] 
    psnr_args.append("ffmpeg") 

    #add first input, the encoded video 
    psnr_args.append("-i") 
    psnr_args.append(full_output_file_name) 

    #add second input, the original video 
    psnr_args.append("-i") 
    psnr_args.append(video_file) 

    #Setup the psnr log file 
    psnr_args.append("-filter_complex") 
    psnr_args.append('psnr="stats_file=%s.psnr"' % vstats_abs_filename) 

    #Output the video to null 
    psnr_args.append("-f") 
    psnr_args.append("null") 
    psnr_args.append("-") 
    print(subprocess.list2cmdline(psnr_args)) 
    run_info_psnr = subprocess.run(psnr_args, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) 
+1

引號是**的指令**,而不是ffmpeg。如果你沒有shell,你不應該有文字引號。把它們留下。 –

回答

0

經過更多的搗鼓,我找到了一個解決方案,在這種情況下,但可能無法在所有情況下工作。如果我使用雙引號作爲外引號,並使用單引號作爲內引號,則子進程的輸出在同一位置使用單引號且不帶反斜線。這是ffmpeg可以接受的。但是,對於雙引號是唯一解決方案的其他人來說,這不會是一個解決方案。

psnr_args.append("psnr='stats_file=%s.psnr'" % vstats_abs_filename) 

輸出到子看起來是這樣的:

In[1]: print(subprocess.list2cmdline(psnr_args)) 
ffmpeg -i test_file-1kB.mp4 -i test_file.mp4 -filter_complex psnr='stats_file=test_file.mp4-1kB.psnr' -f null - 
+0

'list2cmdline'是一個Windows主機。如果你想以一種對Unix系列系統有意義的方式將列表轉換爲命令行,可以在Python 2中使用'''.join(pss.rgs)中的.join(x的管道.quote(x))'或者' shlex.quote'替換Python 3中的'pipes.quote'。 –

+0

簡單引號在windows中沒有特別的含義。 –

+0

@ Jean-FrançoisFabre,(1)true。 (2)是否是針對我的? –

1

在外殼的說法:

psnr="stats_file=test_file.mp4-1kB.psnr" 

絕對相同

psnr=stats_file=test_file.mp4-1kB.psnr 

在shell自己的處理過程中刪除了引號。他們是而不是命令的一部分傳遞給ffmpeg,這並不指望或理解它們。由於您直接告訴Python子進程模塊調用文字參數向量,因此不涉及shell,因此shell語法不應存在。

0

這也與ffmpeg AV過濾器鏈語法有關。您需要運行命令如xxxx -filter_complex "psnr='stats.txt'" xxxx。爲了得到這個,你應該確保封裝過濾器鏈的雙引號到達裏面。子處理器需要一個扁平列表作爲第一個參數,其中該命令是第一個條目。所以['ffmpeg', '-i', "t1.mp4", "-filter_compelx", '"psnr=\'stats.txt\'"', .... and so on ]