у меня есть два разных видео, которые я пытаюсь загрузить в VideoView
используя
videoView.setVideoURI(Uri.parse(url));
два видео, пусть они будут видео 1 и видео 2, имеет следующие технические характеристики (взяты с использованием ffmpeg -i
); по сути, это две разные кодировки одного и того же видео:
-
Видео 1:
Seems stream 0 codec frame rate differs from container frame rate: 180000.00 (180000/1) -> 90000.00 (180000/2)
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '4fbfd5ece4b0932236fc234d.mp4':
Metadata:
major_brand : mp42
minor_version : 0
compatible_brands: mp42isomavc1
creation_time : 2011-12-03 04:43:46
genre : Trailer
artist : Paramount Pictures
title : Captain America: The First Avenger - Theatrical Trailer #2
encoder : HandBrake 4344svn 2011111001
date : 2011
Duration: 00:02:30.67, start: 0.000000, bitrate: 6738 kb/s
Stream #0.0(und): Video: h264 (High), yuv420p, 1920x800 [PAR 1:1 DAR 12:5], 6575 kb/s, 23.97 fps, 90k tbr, 90k tbn, 180k tbc
Metadata:
creation_time : 2011-12-03 04:43:46
Stream #0.1(eng): Audio: aac, 48000 Hz, stereo, s16, 159 kb/s
Metadata:
creation_time : 2011-12-03 04:43:46
-
видео 2:
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '500416ea44aeb4b95d5ae8a0_hd.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
creation_time : 2011-12-03 04:43:46
title : Captain America: The First Avenger - Theatrical Trailer #2
artist : Paramount Pictures
date : 2011
encoder : Lavf53.32.100
genre : Trailer
Duration: 00:02:30.69, start: 0.000000, bitrate: 2045 kb/s
Stream #0.0(und): Video: h264 (High), yuv420p, 1280x720 [PAR 27:20 DAR 12:5], 1889 kb/s, 23.99 fps, 90k tbr, 180k tbn, 180k tbc
Metadata:
creation_time : 2011-12-03 04:43:46
Stream #0.1(eng): Audio: aac, 44100 Hz, stereo, s16, 151 kb/s
Metadata:
creation_time : 2011-12-03 04:43:46
я знаю, что поддержка AAC пришел с Honeycomb, и поэтому я протестировал видео с несколькими устройствами; результаты приведены ниже:
SGS II with custom 4.0.3 OS(Sensation ROM 3.4 with CF-Root kernel) - Video 1:OK - Video2:OK
SGS I with Samsung 2.3.3 OS - Video 1:error (1, -2147483648) - Video 2:OK
SGS I with custom 4.0.3 OS(ICS SGS TEAM ROM with Devil kernel) - Video 1:error (1, -2147483648) - Video 2:OK
Nexus One with original 2.3.6 OS - Video 1:See (1) below - Video 2:See (2) below
Emulator with 2.2 OS - Video 1:error (1, -2147483648) - Video 2:error (1, -2147483648)
Emulator with 4.0.3 OS - Video 1:error (1, -2147483648) - Video 2:error (1, -2147483648)
оба видео отлично воспроизводятся в Google Chrome на ПК. Может быть полезно добавить, что в случае OK видео и аудио воспроизводятся правильно. В случае ошибки (1, -2147483648) тот же журнал извергается со всех устройств (кроме Nexus One):
07-18 10:25:10.996: I/MediaPlayer(17860): uri is:http://s3-eu-west-1.amazonaws.com/cf-templates-k6ohn88yswx5-eu-west-1/videos/4fbc88e7e4b0b0896e877764/4fbfd5ece4b0932236fc234d.mp4
07-18 10:25:10.996: I/MediaPlayer(17860): path is null
07-18 10:25:10.996: D/MediaPlayer(17860): Couldn't open file on client side, trying server side
07-18 10:25:39.859: D/MediaPlayer(17860): getMetadata
07-18 10:25:45.070: E/MediaPlayer(17860): error (1, -2147483648)
07-18 10:25:45.074: E/MediaPlayer(17860): Error (1,-2147483648)
07-18 10:25:45.078: D/VideoView(17860): Error: 1,-2147483648
в случае (1) следующий журнал извергается из Nexus One, и видео никогда не загружается:
07-18 13:49:20.115: D/MediaPlayer(10109): Couldn't open file on client side, trying server side
07-18 13:49:20.115: I/StagefrightPlayer(68): setDataSource('http://s3-eu-west-1.amazonaws.com/cf-templates-k6ohn88yswx5-eu-west-1/videos/4fbc88e7e4b0b0896e877764/4fbfd5ece4b0932236fc234d.mp4')
07-18 13:49:20.135: I/NuHTTPDataSource(68): connect to s3-eu-west-1.amazonaws.com:80/cf-templates-k6ohn88yswx5-eu-west-1/videos/4fbc88e7e4b0b0896e877764/4fbfd5ece4b0932236fc234d.mp4 @0
07-18 13:49:20.155: I/ActivityManager(98): Displayed com.woisio/.video.VideoActivity: +450ms
07-18 13:49:20.795: I/NuCachedSource2(68): Keep alive
07-18 13:49:22.185: I/OMXCodec(68): [OMX.qcom.video.decoder.avc] allocating 4 buffers of size 460800 on input port
07-18 13:49:22.195: I/OMXCodec(68): [OMX.qcom.video.decoder.avc] allocating 8 buffers of size 2304000 on output port
07-18 13:49:25.325: D/dalvikvm(9499): GC_EXPLICIT freed 13K, 50% free 2726K/5379K, external 1625K/2137K, paused 116ms
07-18 13:49:27.525: I/NuCachedSource2(68): Keep alive
07-18 13:49:28.235: I/NuCachedSource2(68): Cache full, done prefetching for now
07-18 13:49:30.275: D/dalvikvm(9902): GC_EXPLICIT freed 8K, 50% free 2714K/5379K, external 1625K/2137K, paused 69ms
07-18 13:49:34.255: D/Finsky(9066): [1] 5.onFinished: Installation state replication succeeded.
07-18 13:49:35.855: I/NuCachedSource2(68): Keep alive
07-18 13:49:39.055: D/dalvikvm(9911): GC_EXPLICIT freed 22K, 50% free 2710K/5379K, external 1625K/2137K, paused 38ms
07-18 13:49:42.575: I/NuCachedSource2(68): Keep alive
07-18 13:49:43.285: I/NuCachedSource2(68): Keep alive
07-18 13:49:44.095: D/dalvikvm(9918): GC_EXPLICIT freed 7K, 50% free 2708K/5379K, external 1625K/2137K, paused 66ms
07-18 13:49:49.085: D/dalvikvm(9925): GC_EXPLICIT freed 15K, 49% free 3268K/6407K, external 1625K/2137K, paused 50ms
07-18 13:49:50.925: I/NuCachedSource2(68): Keep alive
07-18 13:49:54.115: D/dalvikvm(6756): GC_EXPLICIT freed 9K, 44% free 3774K/6727K, external 1625K/2137K, paused 77ms
07-18 13:49:57.685: I/NuCachedSource2(68): Keep alive
07-18 13:49:58.375: I/NuCachedSource2(68): Keep alive
07-18 13:49:59.105: D/dalvikvm(9066): GC_EXPLICIT freed 385K, 53% free 3186K/6727K, external 1625K/2137K, paused 66ms
07-18 13:50:05.955: I/NuCachedSource2(68): Keep alive
07-18 13:50:06.045: D/dalvikvm(8047): GC_EXPLICIT freed 9K, 47% free 3830K/7111K, external 1625K/2137K, paused 86ms
07-18 13:50:09.465: I/3gw.Service(488): Mobile Network not connected - not roaming
07-18 13:50:12.765: I/NuCachedSource2(68): Keep alive
07-18 13:50:13.465: I/NuCachedSource2(68): Keep alive
07-18 13:50:18.775: I/WindowManager(98): Setting rotation to 3, animFlags=0
07-18 13:50:18.795: I/ActivityManager(98): Config changed: { scale=1.0 imsi=286/2 loc=en_US touch=3 keys=1/1/2 nav=3/1 orien=2 layout=34 uiMode=17 seq=34}
07-18 13:50:18.895: D/dalvikvm(169): GC_EXTERNAL_ALLOC freed 108K, 48% free 3253K/6215K, external 5172K/5180K, paused 37ms
07-18 13:50:21.005: I/NuCachedSource2(68): Keep alive
07-18 13:50:21.265: D/dalvikvm(98): GC_EXPLICIT freed 394K, 42% free 6631K/11335K, external 4458K/5567K, paused 109ms
в случае (2) следующий журнал извергается из Nexus One и, как вы можете видеть, заканчивается ошибкой (1, -2147483648):
07-18 13:47:03.595: D/MediaPlayer(10059): Couldn't open file on client side, trying server side
07-18 13:47:03.595: I/StagefrightPlayer(68): setDataSource('http://s3-eu-west-1.amazonaws.com/cf-templates-k6ohn88yswx5-eu-west-1/videos/4ff4514444aec3d2f9f07ead/500416ea44aeb4b95d5ae8a0_hd.mp4')
07-18 13:47:03.605: I/NuHTTPDataSource(68): connect to s3-eu-west-1.amazonaws.com:80/cf-templates-k6ohn88yswx5-eu-west-1/videos/4ff4514444aec3d2f9f07ead/500416ea44aeb4b95d5ae8a0_hd.mp4 @0
07-18 13:47:03.625: I/ActivityManager(98): Displayed com.woisio/.video.VideoActivity: +505ms
07-18 13:47:05.355: I/OMXCodec(68): [OMX.qcom.video.decoder.avc] allocating 4 buffers of size 460800 on input port
07-18 13:47:05.355: I/OMXCodec(68): [OMX.qcom.video.decoder.avc] allocating 8 buffers of size 1382400 on output port
07-18 13:47:05.365: I/NuCachedSource2(68): Keep alive
07-18 13:47:08.375: D/MediaPlayer(10059): getMetadata
07-18 13:47:08.745: D/dalvikvm(9925): GC_EXPLICIT freed 651K, 49% free 3275K/6407K, external 1625K/2137K, paused 68ms
07-18 13:47:09.205: I/3gw.Service(488): Mobile Network not connected - not roaming
07-18 13:47:11.565: I/NuCachedSource2(68): Cache full, done prefetching for now
07-18 13:47:12.095: I/NuCachedSource2(68): Keep alive
07-18 13:47:14.245: W/QCvdec(68): H264_Utils::check_header
07-18 13:47:14.245: W/QCvdec(68): check_header: start code 33
07-18 13:47:14.245: W/QCvdec(68): H264_Utils::check_header
07-18 13:47:14.245: W/QCvdec(68): check_header: start code 10
07-18 13:47:14.245: W/QCvdec(68): Parsing Error unsupported profile or level
07-18 13:47:14.245: W/QCvdec(68): ETB in Invalid State
07-18 13:47:14.245: E/OMXCodec(68): [OMX.qcom.video.decoder.avc] ERROR(0x8000100a, 0)
07-18 13:47:14.245: E/MediaPlayer(10059): error (1, -2147483648)
07-18 13:47:14.285: E/MediaPlayer(10059): Error (1,-2147483648)
07-18 13:47:14.285: D/VideoView(10059): Error: 1,-2147483648
из того, что я прочитал, Ошибка (1, -2147483648) может соответствовать неподдерживаемым кодекам, поврежденным метаданным или неправильным заголовкам файлов. Если это так, не могли бы вы указать меня в правильном направлении как использовать, какой кодек? Спасибо.
Ошибка Android Mediaplayer (1, -2147483648) Ошибка (-38,0) решение (загрузка сети и локальная загрузка)
05.07.2016 09:05:08 Номер чтения: 12640 Теги:androidmediaplayerрешение Больше
Индивидуальный зачет:android
Заявление об авторских правах: эта статья является оригинальной статьей блоггера и не может быть воспроизведена без разрешения блогера. https://blog.csdn.net/wning1/article/details/51828641
-
</pre> Использование SurfaceView или mediaplayer + surface в проекте для воспроизведения видео по сети или локально, часто возникают ошибки (1, -2147483648) Ошибка (-38,0), значение ошибки (1, - 2147483648), 1 представляет <a target = _blank target = "_ blank" href = "https://developer.android.com/reference/android/media/MediaPlayer.html#MEDIA_ERROR_UNKNOWN"> MediaPlayer.MEDIA_ERROR_UNKNOWN </a>, -2147483648 определяется как UNKNOWNOWNOWN_ERRROR_INKNOWN /native/include/utils/Errors.h. Как правило, ошибка (-38,0) вызвана ошибкой (1, -2147483648). Когда медиаплеер является недопустимым объектом, в это время, когда медиаплеер вызывает getDuration () и другие методы, возникает ошибка Error (-38, 0). Ниже приводится информация об ошибке, с которой я столкнулся в то время: <p></p><p> </p> <pre name = "code" class = "java"> 07-03 08: 08: 18.421 12853-13275 / com .suomistudent E / MediaPlayer ﹕ ошибка (1, -2147483648)
-
07-03 08:08:18.451 12853-12853/com.suomistudent E/MediaPlayer﹕ Attempt to call getDuration without a valid mediaplayer
-
07-03 08:08:18.451 12853-12853/com.suomistudent E/MediaPlayer﹕ error (-38, 0)
-
07-03 08:08:18.461 12853-12853/com.suomistudent E/MediaPlayer﹕ Error (1,-2147483648)
Итак, как решить эту проблему:
1. Ошибка (1, -2147483648) возникает во время загрузки сети, т. Е. Не удалось инициализировать медиаплеер. В этом случае обычно следует учитывать следующие моменты:
Во-первых, вам нужно убедиться, что путь к файлу, например каталог, или URL-адрес и URI верны.
1.1 При инициализации MediaPlayer установите источник данных с помощью метода create. Вы не можете написать метод MediaPlayer.prepare (), он сообщит об ошибке. Просмотрите исходный код Mediaplayer.create () следующим образом:
-
public static MediaPlayer create(Context context, int resid,
-
AudioAttributes audioAttributes, int audioSessionId) {
-
try {
-
AssetFileDescriptor afd = context.getResources().openRawResourceFd(resid);
-
if (afd == null) return null;
-
MediaPlayer mp = new MediaPlayer();
-
final AudioAttributes aa = audioAttributes != null ? audioAttributes :
-
new AudioAttributes.Builder().build();
-
mp.setAudioAttributes(aa);
-
mp.setAudioSessionId(audioSessionId);
-
mp.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
-
afd.close();
-
mp.prepare();
-
return mp;
-
} catch (IOException ex) {
-
Log.d(TAG, "create failed:", ex);
-
// fall through
-
} catch (IllegalArgumentException ex) {
-
Log.d(TAG, "create failed:", ex);
-
// fall through
-
} catch (SecurityException ex) {
-
Log.d(TAG, "create failed:", ex);
-
// fall through
-
}
-
return null;
-
}
Метод create () фактически включает создание объектов, установку ресурсов и операции prepare ().
1.2 Если вы используете конструктор MediaPlayer для инициализации MediaPlayer, а затем устанавливаете источник данных с помощью метода setDataSource, вам необходимо использовать метод MediaPlayer.prepare () для однократной компиляции источника данных перед start (). Можно избежать (-38,0) такой ошибки.
1.3. Учитывая проблему кодирования, формат кодирования, поддерживаемый собственным медиаплеером Android при воспроизведении видео, очень ограничен. Поддерживаются следующие форматы:
Если ваш формат видео не относится к одному из этих, будет выдано сообщение об ошибке (1, -2147483648). Для этого вида ошибки вам необходимо рассмотреть возможность преобразования видео в поддерживаемый формат в настоящее время. Здесь я просто вставил формат кодирования видео, если вы хотите просмотреть кодировку звука, проверьтеhttps://developer.android.com/guide/appendix/media-formats.html. (Ps: Я использую фабрику форматов для просмотра подробной информации)
1.4. При выходе из действия вы должны сначала освободить объект Mediaplayer, а затем закрыть действие. Необходимо выполнить следующий код:
-
mMediaPlayer.reset();
-
mMediaPlayer.release();
-
mMediaPlayer = null;
Если вы закроете активность, не выпуская сначала медиаплеер, медиаплеер не будет выпущен. В это время, если вы повторно создадите mMediaplayer, также появится (1, -2147483648). В этом случае вы должны сначала освободить медиаплеер. — это ошибка, которую я обнаружил в проекте.Поначалу я подумал, что это ошибка кодирования формата видео, поэтому внимательно изучил формат кодирования видео, но обнаружил, что проблем нет. Наконец, мы исключили множество ситуаций и обнаружили, что я не выпускал медиаплеер до закрытия активности.
2. Если видео загружается локально:
В дополнение к рассмотрению вышеупомянутых четырех ситуаций, вам также необходимо учитывать разрешения для видео. В конце концов, вы загружаете видео локально. Возможно, у вас нет разрешений на чтение и запись для определенного каталога.
ps: «chmod 777» может понадобиться для исправления разрешений.
Вышесказанное является моим текущим пониманием медиаплеера, я надеюсь помочь вам!
Содержание
- Почему возникает ошибка компиляции в программе Adobe Premiere Pro
- Ошибка кодека
- Недостаточно свободного места на диске
- Изменить свойства памяти
- Нет прав для сохранения файлов в этом месте
- Имя файла не является уникальным
- Бегунки в разделах Sourse и Output
- Решение проблемы сохраняя файл частями
- Неизвестные ошибки
- Вопросы и ответы
Ошибка компиляции в программе Adobe Premiere Pro является одной из самых популярных среди пользователей. Отображается она при попытке экспортировать созданный проект на компьютер. Процесс может прерваться сразу или через определенное время. Давайте разберемся в чем же дело.
Скачать Adobe Premiere Pro
Почему возникает ошибка компиляции в программе Adobe Premiere Pro
Ошибка кодека
Довольно часто эта ошибка возникает из-за несоответствия формата для экспорта и установленного в системе пакета кодеков. Для начала попробуйте сохранить видео в другом формате. Если нет, удалите предыдущий пакет кодеков и установите новый. Например QuickTime, который хорошо сочетается с продуктами из линейки Adobe.
Заходим в «Панель управления-Установка и удаление программ», находим ненужный пакет кодеков и удаляем стандартным способом.
Затем идем на официальный сайт QuickTime, скачиваем и запускаем установочный файл. После завершения инсталляции перегружаем компьютер и запускаем Adobe Premiere Pro.
Недостаточно свободного места на диске
Это часто случается при сохранении видео в определенные форматы. В результате файл становится очень большой и просто не помещается на диске. Определите соответствует ли объем файла свободному месту в выбранном разделе. Заходим в мой компьютер и смотрим. Если места не хватает, тогда удаляем лишнее с диска или экспортируем в другом формате.
Или экспортируем проект в другое место.
Кстати этим методом можно воспользоваться даже если места на диске достаточно. Иногда помогает в решении данной проблемы.
Изменить свойства памяти
Иногда причиной данной ошибки может послужить нехватка памяти. В программе Adobe Premiere Pro есть возможность немного увеличить ее значение, однако следует отталкиваться от объема общей памяти и оставить какой-то запас для работы других приложений.
Заходим в «Edit-Preferences-Memory-RAM available for» и выставляем нужное значение для Premiere.
Нет прав для сохранения файлов в этом месте
Вам необходимо обратится к администратору системы для снятия ограничения.
Имя файла не является уникальным
При экспорте файла на компьютер, он должен иметь уникальное название. Иначе он не будет перезаписан, а просто выдаст ошибку, в том числе и компиляции. Это часто возникает когда пользователь сохраняет один и тот же проект повторно.
Бегунки в разделах Sourse и Output
При экспорте файла, в левой его части есть специальные бегунки, которые регулируют длину видео. Если они выставлены не на полную длину, а при экспорте возникает ошибка, выставьте их на начальные значения.
Решение проблемы сохраняя файл частями
Довольно часто при возникновении данной проблемы пользователи сохраняют видео файл частями. Для начала его нужно разрезать на несколько частей используя инструмент «Лезвие».
Затем с помощью инструмента «Выделение» отмечаем первый отрывок и экспортируем его. И так со всеми частями. После чего части видео опять загружаются в программу Adobe Premiere Pro и соединяются. Зачастую проблема исчезает.
Неизвестные ошибки
Если ничего не помогло, необходимо обратиться в службу поддержки. Так как в Adobe Premiere Pro часто случаются ошибки, причина которых относится к ряду неизвестных. Решить их обычному пользователю не всегда представляется возможным.
Еще статьи по данной теме:
Помогла ли Вам статья?
#android #audio #android-recyclerview #media-player #record
#Android #Аудио #android-recyclerview #медиаплеер #запись
Вопрос:
Запись и остановка работают нормально, но когда я пытаюсь воспроизвести, это вызывает ошибку. Я пробовал запустить метод воспроизведения в фоновом потоке и пробовал его с помощью и без передачи имени файла через метод воспроизведения, но безуспешно. Также, когда я устанавливаю точку останова в своем методе воспроизведения, он пропускает mPlayer.start(). Я использую recyclerview для хранения своих аудиофайлов.
import static android.Manifest.permission.READ_EXTERNAL_STORAGE; import static android.Manifest.permission.RECORD_AUDIO; import static android.Manifest.permission.WRITE_EXTERNAL_STORAGE; import android.media.AudioFormat; import android.media.AudioRecord; import android.media.MediaRecorder; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import androidx.core.app.ActivityCompat; import androidx.core.content.ContextCompat; import androidx.recyclerview.widget.DefaultItemAnimator; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import android.Manifest; import android.content.Context; import android.content.pm.PackageManager; import android.media.AudioFormat; import android.media.AudioRecord; import android.media.MediaPlayer; import android.media.MediaRecorder; import android.os.Bundle; import android.os.Environment; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.TextView; import android.widget.Toast; import java.io.File; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; public class MainActivity extends AppCompatActivity { private static final int STORAGE_PERMISSION_CODE = 279; public static final int AUDIO_PERMISSION_CODE = 555; private String fileName; private MediaRecorder mRecorder; private MediaPlayer mPlayer; Button recordBtn, stopBtn; private TextView tv; private ArrayListlt;Recordgt; recordingList; private RecyclerView recyclerView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); recordBtn = (Button) findViewById(R.id.playB); stopBtn = (Button) findViewById(R.id.stopB); tv = (TextView) findViewById(R.id.tv); checkPermission(WRITE_EXTERNAL_STORAGE, STORAGE_PERMISSION_CODE); checkPermission(READ_EXTERNAL_STORAGE, STORAGE_PERMISSION_CODE); checkPermission(RECORD_AUDIO,AUDIO_PERMISSION_CODE); mRecorder = new MediaRecorder(); recordingList = new ArrayListlt;gt;(); recyclerView = findViewById(R.id.rv); setRecordinfo(fileName); setAdapter(); } private void setRecordinfo(String fileName){ recordingList.add(new Record(fileName)); } private void setAdapter() { RecyclerAdapter adapter = new RecyclerAdapter(recordingList); RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getApplicationContext()); recyclerView.setLayoutManager(layoutManager); recyclerView.setItemAnimator(new DefaultItemAnimator()); recyclerView.setAdapter(adapter); } public void onRecordClick(View v) { record(); } public void onStopClick(View v) { stop(); } public void onPlayClick(View v) { play(fileName); } public void play(String fileName){ mPlayer = new MediaPlayer(); tv.setText("Recording Playing"); try { mPlayer.setDataSource(fileName); mPlayer.prepare(); mPlayer.start(); } catch (IOException e) { Log.e("TAG", "play failed"); } } public void stop(){ if (mRecorder != null) { mRecorder.stop(); mRecorder.reset(); mRecorder.release(); mRecorder = null; tv.setText("Recording stopped"); } if (mPlayer != null) { mPlayer.stop(); mPlayer.release(); mPlayer = null; tv.setText("Player Stopped"); } } public void record(){ // we are initializing our filename variable // with the path of the recorded audio file. Date createdTime = new Date(); fileName = getExternalCacheDir().getAbsolutePath(); fileName = "/" createdTime "test.mp4" ; mRecorder.reset(); mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); mRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); mRecorder.setOutputFile(fileName); mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); try { mRecorder.prepare(); mRecorder.start(); tv.setText("Recording"); //mRecorder.stop(); } catch (IOException e) { e.printStackTrace(); Log.d("Audio","unable to prepare"); } } // Function to check and request permission. public void checkPermission(String permission, int requestCode) { if (ContextCompat.checkSelfPermission(MainActivity.this, permission) == PackageManager.PERMISSION_DENIED) { // Requesting the permission ActivityCompat.requestPermissions(MainActivity.this, new String[] { permission }, requestCode); } else { Toast.makeText(MainActivity.this, "Storage Permission Granted", Toast.LENGTH_SHORT).show(); } } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == STORAGE_PERMISSION_CODE) { if (grantResults.length gt; 0 amp;amp; grantResults[0] == PackageManager.PERMISSION_GRANTED) { Toast.makeText(MainActivity.this, "Storage Permission Granted", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(MainActivity.this, "Storage Permission Denied", Toast.LENGTH_SHORT).show(); } if (requestCode == AUDIO_PERMISSION_CODE) { if (grantResults.length gt; 0 amp;amp; grantResults[0] == PackageManager.PERMISSION_GRANTED) { Toast.makeText(MainActivity.this, "audio Permission Granted", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(MainActivity.this, " Permission Denied", Toast.LENGTH_SHORT).show(); } } } }}
import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; import java.util.ArrayList; //The adapter is the piece that will connect our data to our RecyclerView and determine the ViewHolder(s) which will need to be used to display that data. public class RecyclerAdapter extends RecyclerView.Adapterlt;RecyclerAdapter.MyViewHoldergt; { private ArrayListlt;Recordgt; recordingList; public RecyclerAdapter(ArrayListlt;Recordgt; recordingList){ this.recordingList = recordingList; } public class MyViewHolder extends RecyclerView.ViewHolder{ private TextView recordText; public MyViewHolder(@NonNull View view){ super(view); recordText = view.findViewById(R.id.r2); } } //creates a new RecyclerView.ViewHolder and initializes some private fields to be used by RecyclerView. // allows us to use the resource id with the LayoutInflater in the onCreateViewHolder() method and then return the ViewHolder. @NonNull @Override public RecyclerAdapter.MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.recordings,parent,false); return new MyViewHolder(itemView); } //displays data at a specific index using recycled views //This method is called for each ViewHolder to bind it to the adapter. This is where we will pass our data to our ViewHolder. @Override public void onBindViewHolder(@NonNull RecyclerAdapter.MyViewHolder holder, int position) { String record = recordingList.get(position).getRecordings(); holder.recordText.setText(record); } //returns size of arraylist //This method returns the size of the collection that contains the items we want to display. @Override public int getItemCount() { return recordingList.size(); } }
import android.content.Context; import java.io.BufferedReader; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.util.ArrayList; import java.util.List; public class Record { private String recording; public Record(String recording) { this.recording = recording; } public String getRecordings() { return recording; } public void setRecordings(String recordings) { this.recording = recording; } }
Комментарии:
1. Я все понял! Медиаплееру не удалось найти файл. Я отредактировал путь к файлу, и теперь он работает!
Я так старался разработать приложение для потоковой передачи Интернет-радио, но все, что я получаю, это некоторые принудительные закрытия или ошибки.
Шаги, которые я сделал,
- Я прочитал документацию MediaPlayer здесь.
- Еще прочитал уже доступные решения здесь.
- Я также искал в Google любые решения, но не нашел.
Вот мой код:
Основная деятельность:
private Button pbutton;
private MediaPlayer mediaPlayer;
pbutton = findViewById(R.id.button_play);
pbutton.setEnabled(false);
mediaPlayer = new MediaPlayer();
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
try {
mediaPlayer.setDataSource("http://streams.abidingradio.org:7800/1");
} catch (IOException e) {
e.printStackTrace();
}
mediaPlayer.prepareAsync();
mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
pbutton.setEnabled(true);
}
});
pbutton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mediaPlayer.start();
}
});
Манифест:
<?xml version = "1.0" encoding = "utf-8"?>
<uses-permission android:name = "android.permission.INTERNET"/>
<application
android:allowBackup = "true"
android:icon = "@mipmap/ic_launcher"
android:label = "@string/app_name"
android:roundIcon = "@mipmap/ic_launcher_round"
android:supportsRtl = "true"
android:theme = "@style/AppTheme">
<activity android:name = ".MainActivity">
<intent-filter>
<action android:name = "android.intent.action.MAIN" />
<category android:name = "android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
Когда я запускаю этот код, MediaPlayer не готовится.
И это вызывает следующие ошибки:
нажмите здесь, чтобы увидеть полный журнал
основные ошибки:
failed to init data from source
MediaPlayerNative: error (1, -2147483648)
MediaPlayer: Error (1,-2147483648)
Я занимаюсь этой проблемой почти три дня, но до сих пор не нашел решения. Также могу заверить, что ссылка аудиопотока работает безупречно.
Любая помощь будет принята с благодарностью!
Спасибо.
Перейти к ответу
Данный вопрос помечен как решенный
Ответы
4
Причина в том, что MediaPlayer не поддерживает потоковый формат MPEGA. Взгляните на поддерживаемые аудиоформаты.
Просто используйте один из сторонних плееров, которые совместимы, например, IjkPlayer
или ExoPlayer
У меня была такая же ошибка, но она была только на нескольких телефонах, и я не знал, как ее исправить. В итоге я использовал ExoPlayer
player?.apply {
val mediaItem: MediaItem = MediaItem.fromUri(url)
setMediaItem(mediaItem)
prepare()
play()
}
Используйте вот так.
Заявляем:
Uri alarmSound_carHorn;
Ringtone ringtone_carHorn;
Инициализировать (onCreate):
alarmSound_carHorn = Uri.parse(ContentResolver.SCHEME_ANDROID_RESOURCE + "://" + getApplication().getApplicationContext().getPackageName() + "/" + R.raw.car_horn);
ringtone_carHorn = RingtoneManager.getRingtone(getApplicationContext(),alarmSound_carHorn);
При звонке:
if (ringtone_carHorn!= null && !ringtone_carHorn.isPlaying()){
ringtone_carHorn.play();
}
Я получил ту же ошибку только при вызове onPause -> onResume.
Это было вызвано setOnPreparedListener.
Решение:
binding?.playbackVideoView?.setOnPreparedListener(null)
Очистить подготовленный слушатель, чтобы он не использовал старый объект mediaPlayer