CWAC-Camera getVideoFilename возвращает недопустимое имя файла

Я использую версию jar 0.4.2 в своем проекте для записи видео и его загрузки. Имя файла, возвращаемое функцией SimpleCameraHost.getVideoFileName(), неверно на моем Nexus 4.

Похоже, имя файла имеет отметку времени, и у меня есть файл Video_20131113_223704.mp4 на устройстве, но метод вернул Video_20131113_223708.mp4 на 4 секунды?

Есть ли что-то, что я должен сделать, чтобы получить правильное имя файла?

P.S. Я бы добавил тег cwac-camera, если бы у меня было достаточно репутации...


person Jeff    schedule 14.11.2013    source источник
comment
Похоже, имя файла имеет отметку времени, и у меня есть файл Video_20131113_223704.mp4 на устройстве, но метод вернул Video_20131113_223708.mp4 на 4 секунды? -- если у вас есть только один видеофайл, у вас будет только одно имя видеофайла, а не два, потому что у файла не может быть двух имен. Следовательно, я не понимаю процитированного предложения.   -  person CommonsWare    schedule 14.11.2013
comment
Запуск и остановка записи в вашем классе CameraFrament создали на моем устройстве файл, заканчивающийся на _223704.mp4. Затем вызов метода SimpleCameraHost getVideoFileName() в моем подклассе вернул имя видеофайла, заканчивающееся на _223708.mp4, поэтому, когда я попытался загрузить файл, возвращенный вашим методом, это не удалось, потому что этот файл не существует. Я был сбит с толку, почему SimpleCameraHost возвращает имя файла, которое было «закрытым», и задавался вопросом, есть ли проблема с синхронизацией...   -  person Jeff    schedule 14.11.2013
comment
Не могли бы вы рассказать нам, как вы решили эту проблему. У меня то же самое, и пока не могу найти способ. Спасибо   -  person Abdellah Benhammou    schedule 02.03.2014


Ответы (2)


Запуск и остановка записи в вашем классе CameraFrament создали на моем устройстве файл, заканчивающийся на _223704.mp4.

Это потому, что getVideoPath() предназначен для вызова CameraView, чтобы сгенерировать имя файла, которое будет использоваться для видео. getVideoFileName(), в свою очередь, используется getVideoPath(). Это необходимо сделать до начала записи видео.

Затем вызов метода SimpleCameraHost getVideoFileName() в моем подклассе вернул имя видеофайла, заканчивающееся на _223708.mp4, поэтому, когда я попытался загрузить файл, возвращенный вашим методом, это не удалось, потому что этот файл не существует.

Вы не вызываете getVideoFileName(), вы реализуете его. Ожидается, что если вы используете стандартную реализацию, вам не нужно имя файла в вашем собственном коде. Если вам нужно имя файла, переопределите getVideoFileName() (и/или связанные методы, такие как getVideoPath()), верните то, что вы хотите (что вполне может быть тем, что возвращает суперкласс), и сохраните результат для последующего использования.

person CommonsWare    schedule 14.11.2013
comment
Я вижу, как я неправильно использовал SimpleCameraHost. CameraFragment не имеет средства доступа к имени файла и каталогу, которые он получил от CameraHost, поэтому, если вы не являетесь поставщиком CameraHost, его невозможно получить. Я ошибочно думал, что getVideoFileName в CameraHost вернет тот, который использовал рекордер. - person Jeff; 14.11.2013
comment
@JeffAlexander: Нет, эти данные довольно временны, они просто используются для одной операции записи. Я мог бы кэшировать его и возвращать данные как getLastVideoFileName(), но я не уверен в значении. - person CommonsWare; 15.11.2013
comment
Что ж, вы стараетесь найти хорошее местоположение и красивое имя файла с отметкой времени по умолчанию, но не можете получить его из CameraFragment... - person Jeff; 15.11.2013
comment
@JeffAlexander: Проблема заключается в условиях гонки, что является частой проблемой для getLast...() типов методов - откуда вы знаете, что getLastVideoFileName() не предназначен для какой-то последующей операции, которая была запрошена до того, как вы удосужились вызвать getLastVideoFileName()?. Вероятно, мне нужно начать передавать некоторые CameraTransaction, представляющие конкретную операцию, где хранятся эти имена: github.com/commonsguy/cwac-camera/issues/67 А пока рецепт в моем ответе должен служить обходным путем. - person CommonsWare; 15.11.2013
comment
Может ли кто-нибудь из вас написать прямой ответ, у меня та же проблема, я хочу получить записываемое в данный момент видео, но я получаю имена, отличные от тех, которые фактически сохраняются на устройстве. Некоторое решение для получения имени файла из DemoCameraFragment. - person Abdellah Benhammou; 02.03.2014
comment
@AbdellahBenhammou: Может ли кто-нибудь из вас написать прямой ответ - я написал. Некоторое решение для получения имени файла из DemoCameraFragment - придумайте свой собственный путь и собственный подкласс SimpleCameraHost, где вы возвращаете этот путь из getVideoPath(), а затем также держите этот путь где-нибудь для доступа к остальной части вашего кода. Или переопределите getVideoPath(), привяжите к суперклассу, чтобы получить сгенерированное значение, сохраните этот путь где-нибудь для доступа к остальной части вашего кода и верните этот путь из вашего переопределенного getVideoPath(). - person CommonsWare; 02.03.2014

У меня была такая же проблема с фотографиями, но в основном я также думал, что getPhotoPath вернет путь к фотографии, которую я только что сделал.

Поэтому я внимательно прочитал ответ CommonsWare, особенно ту часть, где он объясняет, как работает getVideoPath().

Это связано с тем, что getVideoPath() предназначен для вызова CameraView для создания > имени файла, которое будет использоваться для видео. getVideoFileName(), в свою очередь, используется функцией getVideoPath(). >Это необходимо сделать до начала записи видео.

Насколько я понимаю, getVideoPath() предназначен для использования системой, а не разработчиком. getVideoPath() вызывает getVideoFilename() и getVideoDirectory() для создания пути к видео, который впоследствии будет использоваться системой для сохранения видео.

При этом, что нам нужно сделать (как уже сказал CommonsWare), так это сообщить системе, по какому пути мы хотим сохранить наш файл. И мы делаем это, переопределяя либо getVideoFilename(), либо getVideoDirectory(), либо getVideoPath().

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

Так как я был доволен каталогом по умолчанию, я просто переопределил getPhotoFilename() следующим образом:

public class MyCameraHost extends SimpleCameraHost {
private String photoName;
private String extension = ".png";

public MyCameraHost(Context _ctxt) {
    super(_ctxt);
    // TODO Auto-generated constructor stub
}

@Override
protected String getPhotoFilename() {
    // TODO Auto-generated method stub
    return this.photoName + this.extension;
}

public void setPhotoName (String name){
    this.photoName = name;
}
}

И в моей работе с камерой мой метод takePhoto() выглядит так:

private void takePicture() {
    CameraFragment f = (CameraFragment) getFragmentManager().findFragmentByTag(TAG_CAMERA_FRAGMENT);
    if (f != null && f.isVisible()) {
        cameraHost.setPhotoName("test");
        f.takePicture();
        pictureFile = cameraHost.getPhotoPath();
    }
}

Надеюсь это поможет. И спасибо CommonWares за эту замечательную библиотеку и ваши ответы на наши вопросы.

person JDenais    schedule 22.12.2014