2013-07-01 1 views
6

MediaExtract를 사용하여 avi 파일의 트랙 0 (비디오 트랙)을 추출하고 MediaCodec을 사용하여 h264 형식으로 인코딩하려고합니다. 다음은 미디어 코덱을 구성하는 방법입니다.setDataSource()를 사용할 때 미디어 추출기를 인스턴스화하지 못했습니다.

내가 직면 한 문제는이 부분에 있습니다.

public MediaExtractor extract_video() 
    { 
     MediaExtractor extractor = new MediaExtractor(); 

     //problem in this line 

     try{ 
      extractor.setDataSource(file_in); 
     }catch(Throwable th){ 
      Log.d("OUT", th.getMessage()); 
     } 

     MediaFormat format = extractor.getTrackFormat(0); 
     String mime = format.getString(MediaFormat.KEY_MIME); 
     Log.d("OUT", String.format("MIME TYPE: %s", mime)); 

     extractor.selectTrack(0); 

     return extractor; 
    } 

여기에 로그가 있습니다.

07-01 10:53:53.284: D/OUT(1779): Main starts 
07-01 10:53:54.024: I/Choreographer(1779): Skipped 82 frames! The application may be doing too much work on its main thread. 
07-01 10:53:54.373: I/Choreographer(1779): Skipped 247 frames! The application may be doing too much work on its main thread. 
07-01 10:53:54.433: D/gralloc_goldfish(1779): Emulator without GPU emulation detected. 
07-01 10:54:00.194: I/Choreographer(1779): Skipped 36 frames! The application may be doing too much work on its main thread. 
07-01 10:54:00.336: D/OUT(1779): Button Start 
07-01 10:54:00.336: D/OUT(1779): start starts 
07-01 10:54:00.344: D/OUT(1779): /mnt/sdcard/test.avi 
07-01 10:54:00.344: D/OUT(1779): /mnt/sdcard/result.h264 
07-01 10:54:00.344: D/OUT(1779): configure starts 
07-01 10:54:00.394: I/OMXClient(1779): Using client-side OMX mux. 
07-01 10:54:00.504: I/SoftAVCEncoder(1779): Construct SoftAVCEncoder 
07-01 10:54:00.534: I/ACodec(1779): setupVideoEncoder succeeded 
07-01 10:54:00.534: E/OMXNodeInstance(1779): OMX_GetExtensionIndex failed 
07-01 10:54:00.544: D/OUT(1779): codec configured 
07-01 10:54:00.734: E/WVMExtractor(1779): Failed to open libwvm.so 
07-01 10:54:00.734: D/OUT(1779): Failed to instantiate extractor. 
07-01 10:54:00.744: D/AndroidRuntime(1779): Shutting down VM 
07-01 10:54:00.755: W/dalvikvm(1779): threadid=1: thread exiting with uncaught exception (group=0x40a13300) 
07-01 10:54:00.924: E/AndroidRuntime(1779): FATAL EXCEPTION: main 
07-01 10:54:00.924: E/AndroidRuntime(1779): java.lang.IllegalArgumentException 
07-01 10:54:00.924: E/AndroidRuntime(1779):  at android.media.MediaExtractor.getTrackFormatNative(Native Method) 
07-01 10:54:00.924: E/AndroidRuntime(1779):  at android.media.MediaExtractor.getTrackFormat(MediaExtractor.java:195) 
07-01 10:54:00.924: E/AndroidRuntime(1779):  at com.app.convert_final.encoder_pack.extract_video(encoder_pack.java:46) 
07-01 10:54:00.924: E/AndroidRuntime(1779):  at com.app.convert_final.encoder_pack.start(encoder_pack.java:81) 
07-01 10:54:00.924: E/AndroidRuntime(1779):  at com.app.convert_final.MainActivity$1.onClick(MainActivity.java:27) 
07-01 10:54:00.924: E/AndroidRuntime(1779):  at android.view.View.performClick(View.java:4084) 
07-01 10:54:00.924: E/AndroidRuntime(1779):  at android.view.View$PerformClick.run(View.java:16966) 
07-01 10:54:00.924: E/AndroidRuntime(1779):  at android.os.Handler.handleCallback(Handler.java:615) 
07-01 10:54:00.924: E/AndroidRuntime(1779):  at android.os.Handler.dispatchMessage(Handler.java:92) 
07-01 10:54:00.924: E/AndroidRuntime(1779):  at android.os.Looper.loop(Looper.java:137) 
07-01 10:54:00.924: E/AndroidRuntime(1779):  at android.app.ActivityThread.main(ActivityThread.java:4745) 
07-01 10:54:00.924: E/AndroidRuntime(1779):  at java.lang.reflect.Method.invokeNative(Native Method) 
07-01 10:54:00.924: E/AndroidRuntime(1779):  at java.lang.reflect.Method.invoke(Method.java:511) 
07-01 10:54:00.924: E/AndroidRuntime(1779):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
07-01 10:54:00.924: E/AndroidRuntime(1779):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
07-01 10:54:00.924: E/AndroidRuntime(1779):  at dalvik.system.NativeStart.main(Native Method) 
07-01 10:54:03.394: I/Process(1779): Sending signal. PID: 1779 SIG: 9 

이 문제는 어떻게 해결해야합니까? libwvm.so 란 무엇입니까? 왜 열리지 않습니까? 여기

내가 함수 호출 방법은 다음과 같습니다

public void start() 
    { 
     this.running = true; 
     Log.d("OUT","start starts"); 
     Log.d("OUT", file_in); 
     Log.d("OUT", file_out); 
     codec = configure_codec(); 
     extractor = extract_video(); 
     now_start(); 
    } 

Mediainfo를 "test.avi"의를

General 
Complete name       : D:\test.avi 
Format         : AVI 
Format/Info        : Audio Video Interleave 
File size        : 967 KiB 
Duration         : 2s 500ms 
Overall bit rate       : 3 169 Kbps 

Video 
ID          : 0 
Format         : JPEG 
Codec ID         : MJPG 
Duration         : 2s 500ms 
Bit rate         : 2 782 Kbps 
Width         : 320 pixels 
Height         : 240 pixels 
Original height       : 480 pixels 
Display aspect ratio      : 4:3 
Frame rate        : 30.000 fps 
Color space        : YUV 
Chroma subsampling      : 4:2:2 
Bit depth        : 8 bits 
Scan type        : Interlaced 
Compression mode       : Lossy 
Bits/(Pixel*Frame)      : 1.207 
Stream size        : 849 KiB (88%) 

Audio 
ID          : 1 
Format         : PCM 
Format settings, Endianness    : Little 
Format settings, Sign     : Signed 
Codec ID         : 1 
Duration         : 2s 500ms 
Bit rate mode       : Constant 
Bit rate         : 352.8 Kbps 
Channel(s)        : 1 channel 
Sampling rate       : 22.05 KHz 
Bit depth        : 16 bits 
Stream size        : 108 KiB (11%) 
Alignment        : Aligned on interleaves 
Interleave, duration      : 33 ms (1.00 video frame) 
여기

전체 코드 : http://pastebin.com/WiCp4SPq encoder_pack.java
http://pastebin.com/JjyR9pdH Main_Activity.java

답변

0

장치가 내장 된 플레이어 (예 : 사전 설치)로이 파일을 재생할 수 있습니까? 네이티브 카메라로 "* .avi"파일을 쓰는 장치를 본 적이 없으므로 장치의 MediaCodec 구현이이 파일 형식을 지원하지 않는다고 생각됩니다.

2

나는이 질문을 던졌다. 나는 여기에 덧붙여 설명하기에 너무 많은 정보를 가지고있다. MediaExtractor.setDataSource throws IOException "failed to instantiate extractor" 나는 내 자신의 질문에 지금 대답했다고 생각한다.

파일에서 추출 할 것을 요청하는 대신 직접 파일을 열고 입력 스트림을 가져온 다음 입력 스트림에서 FileDescriptor를 가져온 다음 파일 설명자에서 추출하도록 요청하는 경우, 그것은 매번 작동합니다.

+2

이 전략을 구현하는 코드를 게시 하시겠습니까? – JellicleCat