2012-08-10 18 views
7

के माध्यम से ट्रिमिंग मैंने this link से जिथब से वीडियो ट्रिमिंग कोड डाउनलोड किया है।एंड्रॉइड वीडियो ffmpeg

यह पहली बार पूरी तरह से काम कर रहा है, लेकिन जब मैं इसे दूसरी बार चलाने की कोशिश करता हूं तो कोड बिना किसी अपवाद के क्रैश हो जाता है, फिर जब मैं क्रैश के बाद इसे तीसरे बार चलाने की कोशिश करता हूं तो यह काम करता है! क्या किसी के पास इस तरह के व्यवहार के लिए कोई विचार है?

मैं एक ऐसे एप्लिकेशन को भी विकसित कर रहा हूं जिसमें वीडियो ट्रिम करने का एक मॉड्यूल है। यदि कोई मेरी मदद कर सकता है तो मैं वास्तव में इसकी सराहना करता हूं।

+1

के साथ कोई किस्मत इसे काम करने के लिए, मुझे एक ही समस्या का सामना करना पड़ रहा है, किसी भी मदद की सराहना की जाएगी। धन्यवाद .. –

+0

मुझे एक ही समस्या का सामना करना पड़ रहा है, अगर आपने इसे हल किया है, तो कृपया मेरी मदद करें। धन्यवाद –

+0

प्रोजेक्ट को साफ़ करने का प्रयास न करें, फिर यह बिना किसी समस्या के चलाएगा। –

उत्तर

0

मुझे लगता है कि आप अपनी गतिविधि को समाप्त कर सकते हैं और कोड में अपने वीडियो ट्रिमिंग कॉल के बाद एप्लिकेशन को पुनरारंभ कर सकते हैं।

यदि दूसरी बार एप्लाइक्शंस क्रैश हो जाता है और तीसरे कार्यों में हो सकता है तो एप्लिकेशन प्रारंभ होने और उसके क्रैश के बाद एप्लिकेशन को पुनरारंभ करें। लोड करने के लिए

प्रयास करें और मूल निवासी पुस्तकालय link

+0

क्या आप कृपया अपना उत्तर दोबारा लिख ​​सकते हैं, मुझे प्रश्न में वर्णित एक ही समस्या का सामना करना पड़ रहा है। –

+0

ठीक है, मैं इसे आज़माउंगा। VideoTrimmingService.java में आप ऑनक्रेट में अपनी मूल पुस्तकालय लोड करते हैं। मुझे लगता है कि अगर आप पहली बार अपनी वीडियो को ट्रिम करते हैं तो गतिविधि को पुनरारंभ करें, दूसरी बार क्रैश नहीं होगा। शायद यह बताता है कि तीसरा समय क्यों काम करता है, आपको हर बार लाइब्रेरी लोड करना होगा जिसे आप इसका इस्तेमाल करते हैं। –

4

https://lists.ffmpeg.org/pipermail/libav-user/2012-May/001964.html

Calling native method twice of third party library in an Activity causes the Android application to close down

'ffmpeg.c' में स्थिर वार्स के साथ इस मुद्दे के बारे में पढ़ा उतारना ...

मैं शर्त लगा सकता हैं कि आपको एक ही समस्या है और रीसेट करने के लिए कुछ (3 वैकल्पिक विकल्प) करने की आवश्यकता है या जीसी उन वर्र्स:

  1. जावा classloader कि lib और जीसी लोड प्राप्त यह

  2. सी परत में

    क्या ओपी ऊपर दी गई लिंक में किया था

  3. एक 2 साझा लिब 'dlsym' का उपयोग करता है लिख सकते हैं और प्रत्येक कॉल चक्र

GitHub के दौरान पहली पुस्तकालय पर 'dlclose', देखें 'README' here

ही है मुकदमा कि उर होने

+0

उत्कृष्ट उत्तर साथी, जिथब लिंक से रीडमे उपयोगी था, क्या आप कृपया अपने उत्तरों 1, 2 और 3 के लिए नमूना डेमो प्रदान कर सकते हैं? ओपी द्वारा दिया गया तीसरा उत्तर केवल प्रतीकात्मक है और सी प्रोग्रामिंग में नौसिखिया होने के नाते मैं यह नहीं समझ सकता कि वह क्या कर रहा है, क्या कोई अन्य लिंक है जो इसे बेहतर समझाता है? –

+1

3 के साथ जाएं। सी में एक दूसरा साझा मॉड्यूल बनाएं जो ffmpeg के लिए स्ट्रिंग एरेरी में वर्र्स प्राप्त करता है, फिर हैंडल प्राप्त करने के लिए dlsym का उपयोग करता है, फिर कॉल करता है - Java_net_video_trimmer_natives_VideoTrimmer_trim और फिर DLCLOSE करता है .. dlclose पहली कॉल से सभी अवशेषों को मिटा देता है। मेरे मूल एएनएस कोड में तीसरा लिंक इसमें समझाया गया है। इसे क्लोन करें और 'ffmpeg_invoke' –

+0

देखें मुझे आश्चर्य है कि आपको काम करने के लिए dlclose कैसे मिला है, एनडीके-दस्तावेज में यह स्पष्ट रूप से कहता है कि "इस समय स्टेटिक डिस्ट्रक्टर्स को कभी भी प्रोग्राम से बाहर नहीं किया जाता है, या जब dlclose() कहा जाता है।" कृपया अपने ndk फ़ोल्डर –

3

बस अपने ffmpeg.c में एक विधि होगा लगता है जो बनाने की तरह इस

void exitmycode(){ 
     ffmpeg_exit(0); 

} 

ffmpeg_exit(0) विधि में पहले से ही वहाँ है ffmpeg.c तुम सिर्फ बाद अपने मुख्य सी फ़ाइल से exitmycode(); कॉल करनी होगी वीडियो ट्रिमिंग की समाप्ति।

अब क्या हो रहा था कि जब आप किसी वीडियो या ffmpeg के साथ कुछ और ट्रिम करते हैं तो यह पूरी तरह से बाहर नहीं निकलता है, इसलिए अगली बार जब आप कमांड चलाते हैं तो यह निकल जाता है, लेकिन यह आपके ट्रिम को भी नहीं चलाता आदेश। अगर आप तीसरे बार चलाते हैं, तो आदेश पूरी तरह से निष्पादित हो जाता है। तो, मैंने जो किया है वह प्रसंस्करण के अंत में ffmpeg_exit(0) मैन्युअल रूप से कॉल कर रहा है।

+0

मुझे लगता है कि यह पूरे ऐप से बाहर निकलने का कारण बनता है - यानी एंड्रॉइड जावा कॉलिंग कोड सहित? साथ ही, जहां तक ​​मैं देख सकता हूं ffmpeg_exit() को ffmpeg स्रोत में exit_program() के साथ बदल दिया गया है। – Mick

-1

एक बात

डू यू ffmpeg4android_os lib स्थापित किया है, तो आप सिर्फ इस

public void stopTranscoding() { 
     Log.d(Prefs.TAG, "stopTranscoding called"); 
     if (_transcodeBackground != null) { 
      //_transcodeBackground.forceCancel(); 
     } 
    } 

है कि सभी तरह StopTranscoding विधि का 1 लाइन टिप्पणी करने के लिए की जरूरत है ....