2013-07-01 23 views
6

Próbuję wyodrębnić ścieżkę 0 (ścieżka wideo) pliku avi za pomocą narzędzia MediaExtract i zakodować do formatu h264 przy użyciu MediaCodec. Oto, jak skonfigurowałem mediaCodecNie można utworzyć instancji klasy mediaextractor przy użyciu metody setDataSource()

Problem z którym się spotykam jest w tej części.

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; 
    } 

Oto dziennik.

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 

Jak rozwiązać ten problem? Co to jest libwvm.so? Dlaczego nie można go otworzyć?

Oto jak zadzwoniłem funkcje:

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 z "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) 

Pełny kod tutaj: http://pastebin.com/WiCp4SPq encoder_pack.java
http://pastebin.com/JjyR9pdH Main_Activity.java

Odpowiedz

0

Czy urządzenie może odtwarzać ten plik za pomocą wbudowanego odtwarzacza (np. Zainstalowanego fabrycznie)? Nigdy nie widziałem urządzeń zapisujących plik "* .avi" z natywnym aparatem, więc podejrzewam, że implementacja MediaCodec na urządzeniu nie obsługuje tego formatu pliku.

2

Sam się o to pytałem (miałem zbyt dużo informacji, aby dodać go tutaj jako komentarz) MediaExtractor.setDataSource throws IOException "failed to instantiate extractor" i myślę, że odpowiedziałem teraz na moje własne pytanie.

Wygląda na to, że jeśli zamiast poprosić o wyodrębnienie z pliku, otworzę plik samodzielnie, otrzymam strumień wejściowy, pobierze FileDescriptor ze strumienia wejściowego, a następnie poproszę o wyodrębnienie z deskryptora pliku, działa za każdym razem.

+2

Czy umieścisz kod implementujący tę strategię? – JellicleCat