2017-06-03 38 views
1

我有一個小型的python程序,能夠非常好地從fcmpeg中使用子過程在linux中捕獲網絡攝像機中的短視頻(至少對於內置網絡攝像頭的筆記本電腦) 。如何在windows中使用ffmpeg抓取筆記本電腦的網絡攝像頭視頻

現在我試圖編寫相同的程序來捕獲Windows中的網絡攝像頭,我知道我不能使用在Linux中工作得很好的通用「/ dev/video0」,但我認爲像命名它「集成攝像頭」應該足夠了,但是失敗了。

這裏是我的Linux代碼(即工作):

import sys 
    from subprocess import call 
    from datetime import datetime 
    def record_webcam(seconds): 
     cam = '/dev/video0' 
     timestamp = datetime.now().strftime('%Y%m%d-%H%M%S') 
     filename = timestamp + 'something.mkv' #generated with more complexity in the actual code, but that isn't important 
     ffmpeg_cmd = 'ffmpeg -t {} -an -i {} -c:v libx264 -preset veryslow -crf 25 {}'.format(seconds, cam, filename).split() 
     p = call(ffmpeg_cmd) 
     return filename if p == 0 else False 

    if __name__ == '__main__': 
     record_webcam(sys.argv[1]) 

我已經看過了ffmpeg的文檔,並試圖尋找解決方案,但到目前爲止,我迷路了......

我知道「集成相機」僅適用於某些筆記本電腦,而不適用於其他筆記本電腦,並且不會捕獲其他連接的相機,但對於我的使用情況來說已足夠了......但如果您想要挑戰我也想知道如何不管它叫什麼,都可以用相機將它應用到任何windows-pc上。

此外,是更容易或更建議做我在這裏只用python工具,像OpenCV一樣嘗試?

在此先感謝! 編輯:如果有人有興趣根據@Mulvya的評論回答我自己的問題,但如果任何人仍然可以向我解釋關於OpenCV的部分,我仍然希望聽到它...

跟進的問題在這裏:ffmpeg through python subprocess fails to find camera

+0

在Windows上,你將不得不使用要麼[DSHOW](https://ffmpeg.org/ffmpeg- devices.html#dshow)或[gdigrab](https://ffmpeg.org/ffmpeg-devices.html#gdigrab)輸入設備。 – Mulvya

+0

嘗試過,但它沒有找到「集成相機」,我認爲它也有一個與libx264編碼混合的問題,但也許我錯了。你能舉出一個適用於任何攝像頭的命令嗎?或者至少*大多數*集成的? –

+2

沒有通用命令。閱讀鏈接文檔中的[示例](https://ffmpeg.org/ffmpeg-devices.html#Examples-2)。首先,您必須檢查可用設備的列表,然後選擇一個並捕獲。使用x264編碼沒有問題。加入'-preset ultrafast -tune zerolatency'。 – Mulvya

回答

1

我做到了......基於什麼@Mulvya評論,我能列出所有相機withing代碼和提取他們的命令,我現在有關於一個不同的問題,但我會問另一個問題。在此期間,如果有人有興趣通過Python和ffmpeg的Windows會自動選擇第一個可用的相機,我的解決辦法是這樣的:

import re 
    from subprocess import Popen, PIPE 
    list_cmd = 'ffmpeg -list_devices true -f dshow -i dummy'.split() 
    p = Popen(list_cmd, stderr=PIPE) 
    for line in iter(p.stderr.readline,''): 
     if flagcam: 
      cam = re.search('".*"',line.decode(encoding='UTF-8')).group(0) 
      cam = 'video=' + cam if cam else '' 
      flagcam = False 
     elif 'DirectShow video devices'.encode(encoding='UTF-8') in line: 
      flagcam = True 
     elif 'Immediate exit requested'.encode(encoding='UTF-8') in line: 
      break 

變量「凸輪」現在持有的凸輪的名字,因爲它是在DirectShow的在Windows

跟進問題here如果有人想幫助編輯:也解決

相關問題