FFmpeg на Android

Я скомпилировал FFmpeg (libffmpeg.so) на Android. Теперь мне нужно создать приложение вроде RockPlayer или использовать существующую мультимедийную среду Android для вызова FFmpeg.

  1. У вас есть шаги / процедуры / код / ​​пример по интеграции FFmpeg в Android / StageFright?

  2. Не могли бы вы подсказать мне, как как я могу использовать эту библиотеку для воспроизведения мультимедиа?

  3. У меня есть требование, когда у меня уже есть транспортные потоки аудио и видео, которые мне нужно передать в FFmpeg и получить их декодирование / рендеринг. @Таблица(...) открытый класс MasterItem реализует java.io.Serializable {private Set criticalItemses ...

    У меня есть два компонента сущностей, определенные следующим образом (несвязанные элементы удалены):

    @Entity
    @Table(...)
    public class MasterItem implements java.io.Serializable {
    
      private Set<CriticalItems> criticalItemses = new HashSet<CriticalItems>(0);
    
      @OneToMany(fetch = FetchType.EAGER, mappedBy = "masterItem", orphanRemoval = true,
                cascade = {javax.persistence.CascadeType.DETACH})
        @Cascade({CascadeType.SAVE_UPDATE, CascadeType.DELETE})
        public Set<CriticalItems> getCriticalItemses() {
            return this.criticalItemses;
        }
    }
    

    CriticalItems определяется следующим образом:

    @Entity
    @Table(...)
    public class CriticalItems implements java.io.Serializable {
    
        private MasterItem masterItem;
    
        @ManyToOne(fetch = FetchType.LAZY, optional = false,
                cascade = {javax.persistence.CascadeType.DETACH})
        @Cascade({CascadeType.SAVE_UPDATE})
        @JoinColumn(name = "mi_item_id", nullable = false)
        public MasterItem getMasterItem() {
            return this.masterItem;
        }
    }
    

    И в мой код DAO - у меня есть следующие методы:

    public MasterItem load(int id) {
        MasterItem results = (MasterItem) getSessionFactory().getCurrentSession()
            .get("com.xxx.MasterItem", id);
    
    }
    
    public void save(MasterItem master) {
        // master has been changed by the UI since it
        getSessionFactory().getCurrentSession().saveOrUpdate(master);
    }
    

    Когда я загружаю MasterItem, он загружается правильно, а также загружает набор CriticalItems с данными, как указано. Затем я отправляю эти данные в свой пользовательский интерфейс и получаю обратно обновленную копию, которую затем пытаюсь сохранить. Пользователь обновляет поля в объекте MasterItem, но не касается набора CriticalItems или чего-либо в нем - он остается неизменным.

    Когда вызывается мой метод save (), Hibernate настаивает на отправке обновлений SQL для каждого элемента в наборе of CriticalItems, хотя ни один из них никак не изменился.

    Покопавшись, вот ' я думаю, что происходит. Когда я выполняю saveOrUpdate (), Hibernate видит, что мой объект MasterItem находится в отсоединенном состоянии, поэтому он пытается перезагрузить его с диска. Однако при этом похоже, что он использует подготовленный оператор (который был автоматически создан Hibernate при запуске), и этот подготовленный оператор не пытается присоединиться к данным CriticalItems.

    Итак, Hibernate имеет мой обновленный MasterItem объект с полным набором CriticalItems, но использует MasterItem без коллекций в качестве своего объекта "previousState". Таким образом, все CriticalItems обновляются через SQL (не вставляются, что само по себе интересно).

    Сделал ли я что-то в своих аннотациях, что вызвало такое поведение? Я знаю, что могу использовать перехватчик, чтобы узнать, действительно ли элемент изменился, или изменил флаг dirty, чтобы переопределить Hibernate ' Судя по комментариям, я думаю, что понимаю разницу между saveOrUpdate () и merge (). Я понимаю, что saveOrUpdate () во всех случаях приведет либо к SQL INSERT, либо к SQL UPDATE, и это слияние теоретически будет выдавать обновления только в том случае, если объект изменился из своего постоянного состояния, но чтобы определить это, Hibernate сначала нужно перезагрузить объект с помощью SQL SELECT.

    Итак, я подумал, что могу просто вернуться в свой код и изменить saveOrUpdate () на merge (), и это сработает, но это было не совсем так.

    ] Когда я использовал merge (), я получал

    org.springframework.orm.hibernate3.HibernateSystemException: could not initialize proxy - no Session; nested exception is org.hibernate.LazyInitializationException: could not initialize proxy - no Session
    

    , но он работал нормально, если я возвращался к saveOrUpdate ().

    Я наконец выяснил, почему - я не включил CascadeType.MERGE в свою аннотацию @Cascade (тьфу). Как только я это исправил, исключение исчезло.

10
задан tshepang 4 February 2014 в 00:15
поделиться