마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

안드로이드에서 재생중인 영상을 pc로 실시간으로 옮길때!!

0 추천

안드로이드 쪽은 문외한이라 질문드려 봅니다. 이번에 공부를 시작하면서 

해보려고 하는 것이 안드로이드에서 재생중인 영상을 실시간으로 pc에 전송해서 재생시키려고 합니다.

저번에  한 분이 조언을 해주시기는 했는데 

MediaExtractor에서 h264코덱의 데이터를 어떻게 얻어오는지 궁금합니다.

만약 코덱의 데이터를 얻어서 전송하면 현재 재생중인 장면의 정보도 pc로 전달이 되는건가요?

딘새 (360 포인트) 님이 2017년 5월 29일 질문

1개의 답변

+1 추천
 
채택된 답변

MediaExtractor에서 h264코덱의 데이터를 어떻게 얻어오는지 궁금합니다.

 => java doc에 예제 코드 있잖아요..  전제가 MP4나 MKV, MpegTS 같은 컨테이너로 이루어진 영상파일에서, H264로 인코딩이 된 데이터가 있을 경우에 해당하는 것으로,

 

예제 코드에 대해 주석을 달아들이면,

 MediaExtractor extractor = new MediaExtractor();

 extractor.setDataSource(...);  // 데이터를 뽑아올 컨텐츠를 설정하는 부분입니다.
 int numTracks = extractor.getTrackCount();  // 컨텐츠에 들어있는 트랙 갯수를 뽑는 부분입니다. 오디오까지 있는 파일이면 2개, 멀티 랭귀지면 2개 이상 나올 수도 있습니다.
 for (int i = 0; i < numTracks; ++i) {
   MediaFormat format = extractor.getTrackFormat(i); // i 에 해당하는 트랙의  포멧 정보를 가져오는 부분입니다.
   String mime = format.getString(MediaFormat.KEY_MIME);
   if (mime.equals(MediaFormat.MIMETYPE_VIDEO_AVC)) {
     extractor.selectTrack(i);  // H264 일 경우 extractor에서 데이터를 읽겠다고  선택하는 부분입니다.
   }
 }
 ByteBuffer inputBuffer = ByteBuffer.allocate(...)
 while (extractor.readSampleData(inputBuffer, ...) >= 0) { // H264 데이터를 읽는 부분입니다. inputBuffer 로 한 프레임의 데이터가 반환됩니다.
   int trackIndex = extractor.getSampleTrackIndex();
   long presentationTimeUs = extractor.getSampleTime();  // 영상을 표시할 시간입니다.
   ...

  // 여기서 H264 데이터(inputBuffer)를 PC로 넘겨주고 PC에서 이 데이터를 디코딩하도록 하면 됩니다. 

  ...

   extractor.advance(); // 다음 프레임의 데이터를 읽기 위해 넘기는 부분입니다.
 }

 extractor.release(); // 종료 하는 부분입니다.
 extractor = null;

 

익명사용자 님이 2017년 5월 29일 답변
딘새님이 2017년 5월 29일 채택됨
감사합니다. 이해가 엄청 잘 되네요
...