#android #kotlin #video #encoding #mp4parser
Вопрос:
Использование Mp4Parser
когда я пытаюсь добавить водяной знак при загрузке видео из пикселей, он выдает ошибку, как показано ниже
2021-11-24 10:43:12.879 5748-5959/com.example.fastsaveapp E/Mp4Composer:
**This device cannot codec with that setting. Check width, height, bitrate, and video format.**
**android.media.MediaCodec$CodecException: Error 0xfffffc0e**
at android.media.MediaCodec.native_configure(Native Method)
at android.media.MediaCodec.configure(MediaCodec.java:1882)
at com.example.fastsaveapp.mp4compose.composer.VideoComposer.setUp(VideoComposer.java:78)
at com.example.fastsaveapp.mp4compose.composer.Mp4ComposerEngine.compose(Mp4ComposerEngine.java:198)
**at com.example.fastsaveapp.mp4compose.composer.Mp4Composer$2.run(Mp4Composer.java:319)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)**
at java.lang.Thread.run(Thread.java:761)
но видео, загруженное с YouTube или из любого видео в Instagram, работает как шарм или из медиа-галереи,
что можно сделать, чтобы добавить водяной знак или закодировать видео с таким высоким битрейтом, например, для загрузки с Pexels или около того..
Mp4Composer(videoPath!!, getDestinationPath())
.filter(GlWatermarkFilter(bitmap, getRepostWatermarkPosition()))
.listener(object : Mp4Composer.Listener {
override fun onProgress(progress: Double) {
mainScoopLauncher {
loadStateEnable(true)
val progressValue = (progress * 100).toString()
val isUnder10Percentage = progressValue.take(2).contains(".")
val under10PercentageValue = "${progress * 100}".take(1) "%"
val upto10PercentageValue = progressValue.take(2) "%"
val loadValue =
if (isUnder10Percentage) under10PercentageValue else upto10PercentageValue
binding.txtPercentage.text = loadValue
}
}
override fun onCurrentWrittenVideoTime(timeUs: Long) {
mainScoopLauncher { loadStateEnable(true) }
}
override fun onCompleted() {
mainScoopLauncher {
loadStateEnable(false)
toast("Repost Video Complate")
}
}
override fun onCanceled() {
logger("cancelled")
mainScoopLauncher {
loadStateEnable(false)
toast("Repost Process Cancel..")
}
}
override fun onFailed(exception: Exception?) {
mainScoopLauncher {
loadStateEnable(false)
toast("Repost Process Failed..")
}
}
}).start()
Комментарии:
1. Вы должны, по крайней мере, указать, какие спецификации видео / кодеки вы пытаетесь перекодировать. Однако, если формат / размер отсутствуют в списке поддерживаемых кодеков , тогда ffmpeg является оставшимся вариантом.
2. битрейт видео составляет 252 кб Ширина кадра 3840 высота кадра 2160 общий битрейт ширина кадра 3840 частота дискретизации аудио 48000 кГц скорость передачи данных составляет 2456 Кбит / с
3. Вы можете использовать VLC на ПК, чтобы получить подробную информацию о кодеке / профиле любого взломанного видеофайла. Тем не менее, в разделе документа по определению совместимости с Android, посвященном кодированию видео , указан ряд «ДОЛЖЕН», что означает дополнительную поддержку.
4. Я протестировал функциональность на другом устройстве redmi note 4, и оно работает, но когда я пытаюсь закодировать то же видео на другом устройстве Lenovo K33a42, оно не работает и выдает ошибку, как указано в моем вопросе. это связано с совместимостью устройств с API MediaCodec?
5. Lenovo K33a42 был выпущен в 2016 году. Попытка декодирования / кодирования UHD / 4K на устройствах с низким и средним уровнем громкости того времени будет неудачной, поскольку эта модель должна поддерживать только спецификацию Android CDD 6.0 .