ffmpeg (API)를 사용하여 웹캠에서 캡처

3943 단어 ffmpeg
대부분의 부분은 이건에 설명을 더한 것.

기본적으로는 「웹캠용 포맷」이라고 하는 포맷 지정(Mac: -f avfoundation , Win: -f dshow )을 할 수 있으므로, 입력 파일로서 디바이스의 번호를 지정( -i "0"라든지 -i "1"라든지)해 적절한 파일에 내보내면 된다.

예를 들어 Macbook에서 FaceTime 카메라에서 mp4 파일에 쓰는 경우 :
ffmpeg -f avfoundation -framerate 25 -i "0" -target pal-vcd -vf scale=640x480 ./test.mpg

위 명령의 경우 ffmpeg는 영원히 쓰기를 계속하므로 끝내고 싶을 때는 Ctrl-C를 누릅니다.

Windows용의 커멘드는 갱신 예정(그러나 시기는 미정).

웹캠 나열



터미널 사용(Mac)



Web 카메라는 AV Foundation 되는 프레임워크 경유로 보인다.-f 선택적으로 avfoundation 지정:
$ ffmpeg -list_devices true -f avfoundation -i dummy



예를 들어 sed 라든지 사용하는 것으로, 인덱스가 들어 있는 곳만 꺼낼 수가 있다:
ffmpeg -list_devices true -f avfoundation -i dummy 2>&1 \
| sed -n -e "/video devices/,/audio devices/s/\[AV[^]]*\] //gp" \
| sed -e "/video devices/d; /audio devices/d"



터미널 사용(Windows)



Windows에서는 avfoundation 대신 dshow (stands for DirectShow)가되므로주의. 나머지는 거의 같지만, 어떻게 출력에서 ​​데이터를 가져오면 좋을까…

참고: FM 페그. 제라의 그림. 작은 m

API를 직접 사용



이것도 한 적이 없다. 여기 원형 복사:
  • 평소대로 AVFormatContext 만들기
  • ffmpeg로 전달 옵션 list_devicesAVDictionary로 전달
  • av_find_input_format("dshow") (Windows의 경우)를 사용하여 캡처 지원 AVInputFormat 얻기
  • "video=dummy" 파일 이름을 사용하여 avformat_open_input() 호출
  • 로그는 (아마도) av_log_set_callback()에서 콜백 함수를 지정하여 가져올 수 있습니다.

  • 아래 참조:
    How to enable ffmpeg logging

    API에서 웹캠 캡처 시작



    위 섹션과 유사합니다. 코드는 여기 페이지 쪽이 상세하다.

    그러나 정보가 최신인지 미확인. ffmpeg는 사양이 잘 바뀌므로 모른다.
  • 평소대로 AVFormatContext를 만듭니다.
  • 해당 AVInputFormatav_find_input_format("dshow")와 같이 가져옵니다
  • 파일 이름은 "video=<device name or index>" 형식의 C 문자열로 지정됩니다
  • 위의 설정을 사용하여 avformat_open_input() 호출
  • 나머지는 일반 API 작업과 동일합니다.
  • AVFormatContext 객체에는 개별 스트림에 대한 포인터가 있습니다. 그 중 하나가 비디오 스트림을 지원합니다 : coder_type 회원이 AVMEDIA_TYPE_VIDEO인지 확인할 수 있습니다.
  • 비디오 스트림에 대응하는 디코더를 avcodec_find_decoder()로 취득
  • 비디오 프레임을 얻기위한 AVFrame 객체를 준비하고 avpicture_fill()에서 버퍼와 연관시킵니다 (이것도 미확인)
  • 스트림에서 디코더로 전달하기위한 AVPacket 준비
  • 나머지는 AVFormatContext 객체에 대해 av_read_frame()를 사용하여 패킷으로 데이터를 전송하고, avcodec_decode_video2()를 호출하여 수시로 AVFrame를 자신의 용도로 사용한다 (미확인)
  • 마지막으로 *_free*() 하는 것을 잊지 않는다

  • 좋은 웹페이지 즐겨찾기