2015-06-01 17 views
7

Tôi đang sử dụng ffprobe để phân tích các tệp phương tiện được lưu trữ trên máy chủ từ xa. Điều này có vẻ hoạt động tốt, nhưng đối với một số tệp, thời lượng bị thiếu hoặc không chính xác (thường dài hơn thời lượng). Những lần khác, nó trả về thông tin này một cách chính xác và dường như không liên quan đến loại phương tiện (codec, v.v.).Làm thế nào để ffprobe xác định thời gian?

Dưới đây là một ví dụ về một lệnh mà làm việc:

ffprobe -v quiet -print_format json -show_streams -show_format http://host.com/file.aiff

{ 
"streams": [ 
    { 
     "index": 0, 
     "codec_name": "pcm_s16be", 
     "codec_long_name": "PCM signed 16-bit big-endian", 
     "codec_type": "audio", 
     "codec_time_base": "1/44100", 
     "codec_tag_string": "[0][0][0][0]", 
     "codec_tag": "0x0000", 
     "sample_fmt": "s16", 
     "sample_rate": "44100", 
     "channels": 2, 
     "bits_per_sample": 16, 
     "r_frame_rate": "0/0", 
     "avg_frame_rate": "0/0", 
     "time_base": "1/44100", 
     "start_pts": 0, 
     "start_time": "0.000000", 
     "duration_ts": 8494248, 
     "duration": "192.613333", 
     "bit_rate": "1411200", 
     "nb_frames": "8494248", 
     "disposition": { 
      "default": 0, 
      "dub": 0, 
      "original": 0, 
      "comment": 0, 
      "lyrics": 0, 
      "karaoke": 0, 
      "forced": 0, 
      "hearing_impaired": 0, 
      "visual_impaired": 0, 
      "clean_effects": 0, 
      "attached_pic": 0 
     } 
    } 
], 
"format": { 
    "filename": "http://host.com/file.aiff", 
    "nb_streams": 1, 
    "nb_programs": 0, 
    "format_name": "aiff", 
    "format_long_name": "Audio IFF", 
    "start_time": "0.000000", 
    "duration": "192.613333", 
    "probe_score": 100 
} 
} 

Dưới đây là một ví dụ về một điều đó không có:

ffprobe -v quiet -print_format json -show_streams -show_format "http://host.com/file.wav"

nào tạo ra kết quả này:

{ 
"streams": [ 
    { 
     "index": 0, 
     "codec_name": "pcm_s16le", 
     "codec_long_name": "PCM signed 16-bit little-endian", 
     "codec_type": "audio", 
     "codec_time_base": "1/44100", 
     "codec_tag_string": "[1][0][0][0]", 
     "codec_tag": "0x0001", 
     "sample_fmt": "s16", 
     "sample_rate": "44100", 
     "channels": 2, 
     "bits_per_sample": 16, 
     "r_frame_rate": "0/0", 
     "avg_frame_rate": "0/0", 
     "time_base": "1/44100", 
     "bit_rate": "1411200", 
     "disposition": { 
      "default": 0, 
      "dub": 0, 
      "original": 0, 
      "comment": 0, 
      "lyrics": 0, 
      "karaoke": 0, 
      "forced": 0, 
      "hearing_impaired": 0, 
      "visual_impaired": 0, 
      "clean_effects": 0, 
      "attached_pic": 0 
     } 
    } 
], 
"format": { 
    "filename": "http://host.com/file.wav", 
    "nb_streams": 1, 
    "nb_programs": 0, 
    "format_name": "wav", 
    "format_long_name": "WAV/WAVE (Waveform Audio)", 
    "bit_rate": "1411200", 
    "probe_score": 99 
} 
} 

Hai ví dụ này là các định dạng khác nhau, nhưng tôi đã thấy nó hoạt động và không hoạt động khi định dạng giống nhau, tôi chỉ không có ví dụ hữu ích. Điều tôi muốn biết là nếu có điều gì đó tôi có thể thay đổi về các thông số tôi đang sử dụng với ffprobe để cho phép thời gian được xác định một cách nhất quán và chính xác hoặc bất kỳ thông tin nào tôi có thể tìm hiểu về cách hoạt động của ffprobe vì vậy tôi tìm ra cách tôi có thể thay đổi các tệp đầu vào, v.v. để chúng hoạt động chính xác.

Ngoài ra, nếu có một công cụ khác hoạt động đáng tin cậy hơn (nó sẽ cần phải là một công cụ Linux nguồn mở), mọi đề xuất hoặc đề xuất đều được chào đón.

+1

Cách chính xác nhất có thể là giải mã hoàn toàn tệp rồi xem đầu ra của bàn điều khiển: 'ffmpeg -i input -f null -'. Rất tiếc, quá trình này có thể mất một chút thời gian tùy thuộc vào đầu vào của bạn. – LordNeckbeard

+0

Tôi nghĩ FFmpeg đã sử dụng vùng chứa để tính toán thời lượng (về cơ bản là tin tưởng vào bất kỳ siêu dữ liệu nào trong vùng chứa ...)? – rogerdpack

+0

@LordNeckbeard ffmpeg cung cấp thời gian chính xác sau khi quá trình chuyển mã hoàn tất, nhưng đối với ứng dụng của tôi, tôi không thể lưu trữ kết quả trước khi bắt đầu trả lại cho khách hàng (hoặc cách khác, thời gian để chạy thao tác chuyển mã hai lần) . – jasongullickson

Trả lời

3

Một giải pháp đơn giản là sử dụng tùy chọn -show_packets

ffprobe -i input.mp4 -show_packets > a.txt 

a.txt Bây giờ mở và đi đến gói cuối cùng và xem dts_time giá trị đó sẽ là thời gian chính xác của tập tin. Nếu dts_time không được xác định, hãy kiểm tra giá trị pts_time.

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