친근한 방식으로 ffmpeg 정보 얻기


108

ffmpeg로 내 비디오 파일에 대한 정보를 얻으려고 할 때마다 좋은 것과 섞인 쓸모없는 정보가 많이 나옵니다.

나는 ffmpeg -i name_of_the_video.mpg.

친근한 방법으로 얻을 수있는 가능성이 있습니까? 제 말은 JSON이 훌륭 할 것이라는 의미입니다 (그리고 추악한 XML도 괜찮습니다).

지금까지 응용 프로그램에서 정규식으로 데이터를 구문 분석하도록 만들었지 만 일부 특정 비디오 파일에 나타나는 불쾌한 모서리가 많이 있습니다. 나는 내가 만난 모든 것을 고쳤지만 더 많을 수도 있습니다.

나는 다음과 같은 것을 원했다.

{
  "Stream 0": {
     "type": "Video",
     "codec": "h264",
     "resolution": "720x480"
  },
  "Stream 1": {
     "type": "Audio",
     "bitrate": "128 kbps",
     "channels": 2
  }
}

3
ffprobe보셨습니까 ? JSON으로 읽을 수있는 출력을 제공하는 것 같습니다.
NT3RP

나는 이미 그것을 lookead 한하지만 JSON 출력 형식을 찾을 수 없습니다
JBernardo

답변:


292

조금 늦었지만 여전히 누군가와 관련이있을 수 있습니다 ..

ffprobe정말 좋은 방법입니다. 그러나 ffprobe표시 할 정보 ( -show_format, -show_packets-show_streams옵션 사용)를 지정해야합니다. 그렇지 않으면 주석 중 하나에서 언급 한 것처럼 빈 출력 만 제공됩니다.

예를 들어 ffprobe -v quiet -print_format json -show_format -show_streams somefile.asf다음과 같은 결과를 얻을 수 있습니다.

{
  "streams": [{
    "index": 0,
    "codec_name": "wmv3",
    "codec_long_name": "Windows Media Video 9",
    "codec_type": "video",
    "codec_time_base": "1/1000",
    "codec_tag_string": "WMV3",
    "codec_tag": "0x33564d57",
    "width": 320,
    "height": 240,
    "has_b_frames": 0,
    "pix_fmt": "yuv420p",
    "level": -99,
    "r_frame_rate": "30000/1001",
    "avg_frame_rate": "0/0",
    "time_base": "1/1000",
    "start_time": "0.000",
    "duration": "300.066",
    "tags": {
        "language": "eng"
    }
  }],
  "format": {
    "filename": "somefile.asf",
    "nb_streams": 1,
    "format_name": "asf",
    "format_long_name": "ASF format",
    "start_time": "0.000",
    "duration": "300.066",
    "tags": {
        "WMFSDKVersion": "10.00.00.3646",
        "WMFSDKNeeded": "0.0.0.0000",
        "IsVBR": "0"
    }
  }
}

1
누군가 필요하다면, 그 대답을 기반으로 PHP 솔루션을 작성했습니다 : stackoverflow.com/questions/11805207/…
Paulo Freitas

파헤쳐 서 미안하지만 속도를 높일 수 있습니까? 출력을 표시하는 데 5 ~ 6 초가 걸립니다
mangia 2014 년

그 마지막 문장은 정확히 제가 필요로하는 것입니다. 감사합니다 :)
Matt Fletcher 2014

5
사람들은 ... 3 년 전의 응답에 코멘트에서 질문을하는 것은 제로에 대한 기회는 대답지고있다 ...
패트릭

1
-of json대신 사용할 수도 있습니다 -print_format json. 전자는 호환되는 avprobe반면 후자 는 호환 되지 않습니다.
Chih-Hsuan Yen

15

이제으로 -progress -형식이 지정된 친숙한 정보를 인쇄하는 데 사용할 수 있습니다 key=value.

ffmpeg  -i video.mp4 .......-s 1920x1080 -progress - -y out.mp4

speed=5.75x
frame=697
fps=167.7
stream_0_0_q=39.0
bitrate=2337.0kbits/s
total_size=6979778
out_time_ms=23893333
out_time=00:00:23.893333
dup_frames=0
drop_frames=0

3
알아 둘만 한. 왜 이것이 문서에 언급되지 않았는지 궁금합니다 .
Duvrai

이것은 좋다! "-progress-"가 문서에 언급되지 않은 이유는 "-"가 표준 출력으로 파이프를 연결한다는 의미이기 때문입니다
Chris W

13

시도해 볼 수 ffprobe있습니다. JSON 출력을 얻기위한 올바른 명령은 다음과 같아야합니다.

ffprobe ... -print_format json

2
최신 ffmpeg를 컴파일했지만 프로그램의 json 출력은 {}. 그것은 ... 내가 가지고있는 비디오 파일을 작동하는 것 같다되지 않습니다
JBernardo

2
@JBernardo Hey, 다른 사람이이 문제를 겪는 경우 -of 대신 -print_format을 수행해야합니다. 그렇지 않으면 매우 도움이되지 않는 {... 일반 인쇄 출력을 수행합니다 ...} 예제 명령 줄
mgrandi

0

또 다른 사용법 ffprobe은 훌륭하게 구문 분석 할 수 있습니다.

ffprobe -v error -select_streams v:0 -show_entries stream=width,height,r_frame_rate,bit_rate,codec_name,duration -of csv=p=0:s=x video.mp4

결과 :

h264x600x480x25/1x385.680000x542326

-select_streams v:0비디오 스트림 만 선택합니다. 해당 매개 변수를 제거하면 각 스트림에 대해 한 줄을 얻습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.