2009-12-01 52 views
6

Tôi đang cố gắng tự động chuyển đổi video bằng công cụ powershell và ffmpeg. Ffmpeg có đầu ra chi tiết về video nếu được gọi mà không có tất cả tham số nessesary. Thông thường nó báo cáo về lỗi và hiển thị thông tin tập tin đầu vào nếu một quy định. Ex tôi tương tác thực thi lệnh như:powerhell và đầu ra ứng dụng giao diện điều khiển

d: \ video.Enc \ ffmpeg.exe -ID: \ video.Enc \ 1.wmv

đây là PowerShell console đầu ra

ffmpeg.exe : FFmpeg version SVN-r20428, Copyright (c) 2000-2009 Fabrice Bellard, et al. 
row:1 char:24 
+ d:\video.Enc\ffmpeg.exe <<<< -i d:\video.Enc\1.wmv 
    + CategoryInfo   : NotSpecified: (FFmpeg version ...Bel 
    lard, et al.:String) [], RemoteException 
    + FullyQualifiedErrorId : NativeCommandError 

    built on Nov 1 2009 04:03:50 with gcc 4.2.4 
    configuration: --enable-memalign-hack --prefix=/mingw --cross-pre 
fix=i686-mingw32- --cc=ccache-i686-mingw32-gcc --target-os=mingw32 
--arch=i686 --cpu=i686 --enable-avisynth --enable-gpl --enable-vers 
ion3 --enable-zlib --enable-bzlib --enable-libgsm --enable-libfaad 
--enable-pthreads --enable-libvorbis --enable-libtheora --enable-li 
bspeex --enable-libmp3lame --enable-libopenjpeg --enable-libxvid -- 
enable-libschroedinger --enable-libx264 --enable-libopencore_amrwb 
--enable-libopencore_amrnb 
    libavutil  50. 3. 0/50. 3. 0 
    libavcodec 52.37. 1/52.37. 1 
    libavformat 52.39. 2/52.39. 2 
    libavdevice 52. 2. 0/52. 2. 0 
    libswscale  0. 7. 1/0. 7. 1 
[wmv3 @ 0x144dc00]Extra data: 8 bits left, value: 0 

Seems stream 1 codec frame rate differs from container frame rate: 
1000.00 (1000/1) -> 15.00 (15/1) 
Input #0, asf, from 'd:\video.Enc\1.wmv': 
    Duration: 00:12:0 
2.00, start: 5.000000, bitrate: 197 kb/s 
    Stream #0.0(eng): Audio: wmav2, 44100 Hz, 1 channels, s16, 48 k 
b/s 
    Stream #0.1(eng): Video: wmv3, yuv420p, 1024x768, 137 kb/s, 15 tbr, 1k tbn, 1k tbc Metadata 
    title   : Silverlight 2.0 Hello World Application 
    author   : Sergey Pugachev 
    copyright  : 
    comment   : 
    WMFSDKVersion : 11.0.6001.7000 
    WMFSDKNeeded : 0.0.0.0000 
    IsVBR   : 1 
    ASFLeakyBucketPairs: 
    VBR Peak  : 715351 
    Buffer Average : 127036 
At least one output file must be specified 

Nhưng tôi không thể tìm cách viết kịch bản này và bắt đầu xuất ra bất kỳ loại đối tượng posh nào. Tôi đã thử kịch bản lệnh trực tiếp, trong đó tệp ps1 chứa biểu thức chính xác "d: \ video.Enc \ ffmpeg.exe -i d: \ video.Enc \ 1.wmv" - nó không hoạt động. Ngoài ra tôi đã cố gắng làm điều đó với lệnh gọi và gọi biểu thức. Đầu tiên trả về một chuỗi chính xác với lệnh, thứ hai - lỗi kết xuất cho giao diện điều khiển đầu ra nhưng không phải là -ErrorVariable i được chỉ định (tôi đã đặt tất cả các biến, không chỉ lỗi một - tất cả chúng đều trống).

Bất kỳ ai có thể trỏ chính xác cú pháp để gọi các ứng dụng bảng điều khiển trong chế độ posh và bắt đầu ra không?

Câu hỏi thứ hai sẽ là phân tích cú pháp kết quả đầu ra đó - Tôi sẽ cần dữ liệu độ phân giải video để tính tỷ lệ khung hình chính xác cho chuyển đổi. Vì vậy, nó sẽ là tuyệt vời nếu điểm ai làm thế nào để làm việc với sản lượng lỗi bị bắt và phân tích chuỗi như

Suối # 0.1 (eng): Video: WMV3, yuv420p, 1024x768,

Trả lời

7

Cố gắng chuyển hướng dòng lỗi để thiết bị xuất chuẩn như vậy và sau đó bạn sẽ có thể chụp cả stdout và stderr trong một ví dụ biến duy nhất:

$res = d:\video.Enc\ffmpeg.exe -i d:\video.Enc\1.wmv 2>&1 

để nắm bắt các dữ liệu thử điều này:

$res | Select-String '(?ims)^Stream.*?(\d{3,4}x\d{3,4})' -all | 
    %{$_.matches} | %{$_.Groups[1].Value} 

Tôi không chắc liệu $ res sẽ là một chuỗi hay nhiều nhưng ở trên sẽ hoạt động cho cả hai trường hợp.

+0

Stderr để stdout hoạt động tốt. Cảm ơn bạn. Có cách nào để có được stderr và stdout riêng biệt? Thu thập dữ liệu có chút khác biệt (có 2 hoặc nhiều luồng thông tin đầu ra tách biệt - cho âm thanh và video), sẽ cần phải trả về hoặc loại trừ cho "Luồng" ít nhất, nhưng một điểm tôi có thể tự hoàn thành. Đánh giá cao cho các điểm khởi đầu bạn đã cho tôi. –

+0

Vâng, bạn có thể chụp chúng một cách riêng biệt - ffmpeg.exe ...> foo.txt 2> foo.err –

+0

:) tôi không hoàn toàn rõ ràng :) là có bất kỳ cách nào để có được luồng dữ liệu riêng biệt. Ex Invoke-Expression có các khóa để chỉ định ErrorVariable và OutVariables. là có cách nào để có được đầu ra bằng cách sử dụng loại cú pháp như vậy, không sử dụng các tập tin tạm thời? –

Các vấn đề liên quan