天道酬勤,学无止境

MediaMetadataRetriever extractMetadata 方法返回 null(MediaMetadataRetriever extractMetadata method returning null)

问题

我正在使用 MediaMetadataRetriever 类来获取有关视频的元数据,但是在获取有关高度的信息时,它返回 null,而对于宽度,它返回零。 这是我的代码:

MediaMetadataRetriever metaRetriever = new MediaMetadataRetriever();
String width =  metaRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH);
String height = metaRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT);

有没有其他方法可以获取视频的宽度和高度?

标签

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • MediaMetadataRetriever 的 Android 问题:返回空值(Android problems with MediaMetadataRetriever: return null value)
    问题 尝试使用 MediaMetadataRetriever 检索 mp3 信息(专辑名称,...)。 在模拟器中它运行良好。 在我的设备上,大多数方法返回 null。 MediaMetadataRetriever mmr = new MediaMetadataRetriever(); mmr.setDataSource(songPath); 字符串专辑名称 = mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ALBUM); String mp3Title = mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE); String mimekey = mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_MIMETYPE); mp3 肯定有这些信息,因为在模拟器中显示了这些信息(同一个文件!)。 文件路径没问题,设置了 mimekey,我也不例外。 我正在使用 SdkVersion=14。 我已经检查了如何使用 MediametadataRetriever 从 android 中的专辑/艺术家中获取歌曲? 和 Android MediaMetadataRetriever 从大多数键返回空值
  • 如何获取视频文件的持续时间?(How to get duration of a video file?)
    问题 我是 Android 编程的初学者。 我正在编写一个应用程序来列出文件夹中的所有视频文件并显示文件夹中所有视频的信息。 但是当我尝试获取视频时长时它返回 null 并且我找不到获取它的方法。 任何人都可以帮助我吗? 下面是我的代码: Uri uri = Uri.parse("content://media/external/video/media/9"); Cursor cursor = MediaStore.Video.query(res, data.getData(), new String[]{MediaStore.Video.VideoColumns.DURATION}); if(cursor.moveToFirst()) { String duration = cursor.getString(0); System.out.println("Duration: " + duration); } 回答1 使用MediaMetadataRetriever检索媒体特定数据: MediaMetadataRetriever retriever = new MediaMetadataRetriever(); //use one of overloaded setDataSource() functions to set your data source retriever
  • Android MediaMetadataRetriever 从大多数键返回空值(Android MediaMetadataRetriever returns null values from most keys)
    问题 我想从我的媒体文件(主要是 mp3)中获取信息,而我只从我想要的那些值中获取 null。 我已经尝试了extractMetadata(key)所有键。 我是否跳过/遗漏了什么? 代码基础: MediaMetadataRetriever f = new MediaMetadataRetriever(); f.setDataSource(item.getFilePath()); String title = f.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE); 我确实使用持续时间键(MediaMetadataRetriever.METADATA_KEY_DURATION)和 mimetype 键(MediaMetadataRetriever.METADATA_KEY_MIMETYPE)获得了正确的值,这表明数据源/文件路径正在工作。 Poweramp(流行的媒体播放器)能够读取元数据值,如标题/作者/作曲家等,因为它会在 UI 中显示这些额外的值。 或者 Poweramp 从其他来源或方法获取这些值? 任何帮助表示赞赏。 回答1 这可能听起来很傻,但您是否尝试过许多不同的 mp3 文件? 根据我的经验,如果您非法获取 mp3 文件,密钥有时就不存在。 回答2 Poweramp 在 /data/data/com
  • 获取音频文件的持续时间(get duration of audio file)
    问题 我已经制作了一个录音机应用,我想在列表视图中显示录音的持续时间。 我这样保存录音: MediaRecorder recorder = new MediaRecorder(); recorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT); recorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT); folder = new File(Environment.getExternalStorageDirectory() + File.separator + "Audio recordings"); String[] files = folder.list(); int number = files.length + 1; String filename = "AudioSample" + number + ".mp3"; File output = new File(Environment.getExternalStorageDirectory() + File.separator + "Audio recordings" + File.separator + filename); FileOutputStream writer = new
  • android压缩
    关于视频压缩有以下几种方式可选: 第一种:使用FFmpeg 缺点: 1.压缩效率低,时间长,使用繁琐,增大apk体积 2.如果只是对视频进行压缩,不建议使用FFmpeg 第二种:使用七牛SDK 七牛短视频SDK链接: https://developer.qiniu.com/sdk#official-sdk 缺点:收费,只能试用,测试的结果:隔天就会提示未经授权 PLDroidShortVideo: Pili-System:unauthorized ! compressVideoResouce: transcode failed: 8 第三种:使用开源库SiliCompressor,一个强大的,灵活的,易于使用的视频和图像压缩库。 开源库地址 https://github.com/Tourenathan-G5organisation/SiliCompressor 1.Gradle implementation’com.iceteck.silicompressorr:silicompressor:2.2.1’ 2.添加相关权限 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.WRITE
  • 如何将使用 MediaRecorder 录制的视频长度读取到通过 context.getFilesDir() 构造的私有应用程序存储目录中?(How to read length of video recorded with MediaRecorder into private app storage directory constructed via context.getFilesDir()?)
    问题 我在使用 MediaRecorder 读取用设备相机录制的视频文件的长度/持续时间时遇到了一个奇怪的问题。 该文件被记录到应用程序的私有存储目录​​中,其设置如下: mMediaRecorder.setOutputFile(context.getFilesDir() + "/recordings/webcam.3gpp"); 录制完成后,我尝试使用以下方法读取视频的长度: 方法一: MediaMetadataRetriever mediaMetadataRetriever = new MediaMetadataRetriever(); mediaMetadataRetriever.setDataSource(context.getFilesDir() + "/recordings/webcam.3gpp"); String time = mediaMetadataRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION); return Long.parseLong(time); 方法二: MediaPlayer mp = MediaPlayer.create(context, Uri.parse(context.getFilesDir() + "/recordings/webcam.3gpp
  • Android MediaMetadataRetriever 无法在旧的三星设备上加载元数据(Android MediaMetadataRetriever fails to load metadata on old Samsung devices)
    问题 我在使用 android.media.MediaMetadataRetriever 时遇到了一个奇怪的问题。 它无法从 Android 4.0.4 和 4.1.2 版本的三星手机上的视频文件中提取视频宽度。 调用 metaRetriever.extractMetadata() 似乎返回 null 或空字符串,因为我的应用程序的用户报告 VideoSetupException 错误代码为 ASVF_3。 它适用于具有上述 Android 版本和所有其他 Android 版本和设备的 Google 模拟器。 知道是什么原因造成的吗? 在我看来,三星分发的 Android 版本中存在一个错误。 非常感谢。 M。 private void setVideoViewDimensionToMatchVideoMetadata(VideoView videoView, Uri uri) { String metadataVideoWidth; String metadataVideoHeight; try { final MediaMetadataRetriever metaRetriever = new MediaMetadataRetriever(); metaRetriever.setDataSource(getActivity(), uri); metadataVideoWidth
  • MediaMetadataRetriever extractMetadata method returning null
    I am using MediaMetadataRetriever class to get metadata about a video but while getting the information about the height it is returning null and for width it is returning zero. Here is my code: MediaMetadataRetriever metaRetriever = new MediaMetadataRetriever(); String width = metaRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH); String height = metaRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT); Is there any other way to get width and height of a video?
  • 在 Android 中获取音频文件持续时间的最佳方法是什么?(What is the best way to get an audio file duration in Android?)
    问题 我正在使用 SoundPool 在我的应用程序中播放音频剪辑。 一切都很好,但我需要知道剪辑播放何时完成。 目前我通过使用 MediaPlayer 实例获取每个剪辑的持续时间在我的应用程序中跟踪它。 这工作正常,但为了获得持续时间而将每个文件加载两次看起来很浪费。 我可以在知道文件长度(可从 AssetFileDescriptor 中获得)的情况下粗略计算持续时间,但我仍然需要知道采样率和通道数。 我看到了该问题的两种潜在解决方案: 确定剪辑何时完成播放(SoundClip 似乎无法实现)。 有一个类可以只加载音频文件的标题,并为我提供采样率/通道数(理想情况下,可以获得准确持续时间的样本计数)。 有什么建议? 谢谢,马克斯 我目前使用的代码(工作正常,但为此目的相当繁重): String[] fileNames = ... MediaPlayer mp = new MediaPlayer(); for (String fileName : fileNames) { AssetFileDescriptor d = context.getAssets().openFd(fileName); mp.reset(); mp.setDataSource(d.getFileDescriptor(), d.getStartOffset(), d.getLength()); mp
  • Android problems with MediaMetadataRetriever: return null value
    Trying to retrieve mp3 informations (Albumname,...) with MediaMetadataRetriever. In the emulator it worked fine. On my device most methods returns null. MediaMetadataRetriever mmr = new MediaMetadataRetriever(); mmr.setDataSource(songPath); String albumName = mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ALBUM); String mp3Title = mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE); String mimekey = mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_MIMETYPE); The mp3 has definitly these informtion because in the emulator these information (the same file!) are shown
  • 从Android应用程序中的URL获取视频时长(get video duration from URL in android app)
    问题 我正在开发一个应用程序,用户可以在其中查看存储在服务器上的所有视频信息和标题。 我几乎完成了它,除了无论我如何编码,我都无法从给定的 URL 获取视频时长。 让我们从互联网上的某个地方获取此演示视频:单击此处获取视频路径我希望该应用程序无需打开视频即可获取视频时长。 我试图在 android 上使用的代码是这样的: MediaMetadataRetriever retriever = new MediaMetadataRetriever(); retriever.setDataSource("https://12-lvl3-pdl.vimeocdn.com/01/1386/0/6932347/10573836.mp4?expires=1461047937&token=037972137fdfc4c2d9902"); String time = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION); long timeInmillisec = Long.parseLong( time ); long duration = timeInmillisec / 1000; long hours = duration / 3600; long minutes = (duration - hours
  • 从视频中获取多个缩略图(Get multiple thumbnails from video)
    问题 我正在使用MediaMetadataRetriever来检索视频中特定时间的缩略图。 这就是我实现这一目标的方式: MediaMetadataRetriever metadataRetriever = new MediaMetadataRetriever(); try { metadataRetriever.setDataSource(MainActivity.this, Uri.parse("android.resource://packageName/raw/"+"test")); String duration=metadataRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION); long time = Long.valueOf(duration)/3; Bitmap bitmap1 = metadataRetriever.getFrameAtTime(time,MediaMetadataRetriever.OPTION_CLOSEST_SYNC); imgone.setImageBitmap(bitmap1); }catch (Exception ex) { Toast.makeText(MainActivity.this, String.valueOf(ex), Toast
  • 流源上的MediaMetadataRetriever(MediaMetadataRetriever on streaming source)
    问题 我很难显示从流媒体源播放的当前曲目。 使用MediaMetaDataRetriever类返回NULL,表示失败。 我写了一个简单的方法,但现在我倾向于认为这仅适用于MP3,WMA,AVI等媒体文件。 public void metaData(){ mmr.setDataSource(urlStation); String metaD = mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ALBUMARTIST); Toast.makeText(MainActivity.this, "Artist = " + metaD, Toast.LENGTH_LONG).show(); 任何好的和容易的建议将不胜感激。 感谢您的时间! 回答1 MediaMetadataRetriever在某些版本的Android上无法使用URL,请参见此问题。 我创建FFmpegMediaMetadataRetriever作为一种解决方法,建议尝试一下。 回答2 根据另一个答案中列出的相同问题,您只需要使用带有以下参数的setDataSource方法: setDataSource(String uri, Map<String, String> headers) 例如 public void getStreamMetaData(String
  • Android MediaMetadataRetriever fails to load metadata on old Samsung devices
    I'm facing a strange issue when using the android.media.MediaMetadataRetriever. It fails to extract the video width from video files on Samsung phones with Android version 4.0.4 and 4.1.2. The call metaRetriever.extractMetadata() seems to return either null or an empty string, as users of my app are reporting the VideoSetupException with error code ASVF_3. It works on the Google emulators with said Android versions and all other Android versions and devices. Any idea what might be causing this? It seems to me that there is a bug in the Android version distributed by Samsung. Thanks a lot. M
  • How to read length of video recorded with MediaRecorder into private app storage directory constructed via context.getFilesDir()?
    I am having a weird issue reading the length/duration of a video file recorded with a device's camera by using MediaRecorder. The file is recorded into the application's private storage directory, which is set like so: mMediaRecorder.setOutputFile(context.getFilesDir() + "/recordings/webcam.3gpp"); After recording is complete, I attempt to read the length of the video with these methods: Method 1: MediaMetadataRetriever mediaMetadataRetriever = new MediaMetadataRetriever(); mediaMetadataRetriever.setDataSource(context.getFilesDir() + "/recordings/webcam.3gpp"); String time =
  • 使用 MediaStore 和 MediaMetadataRetriever 从其他媒体文件中过滤 mp3 文件?(filter mp3 files from other media files using MediaStore & MediaMetadataRetriever?)
    问题 我想在我的应用程序上有一个ListView ,它填充我的外部存储上的所有 mp3 文件。 这是 onCreate 方法中的代码。 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); mListView = (ListView) findViewById(R.id.listView1); List<DoubleString> mList = new ArrayList<DoubleString>(); String selection = MediaStore.Audio.Media.IS_MUSIC + " != 0"; final String sortOrder = MediaStore.Audio.AudioColumns.TITLE; ContentResolver resolver = getContentResolver(); Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; Cursor cursor = resolver.query(uri, null, selection, null
  • Android MediaMetadataRetriever returns null values from most keys
    I want to get information out of my media files (mp3 mostly) and I get only null from those values I want. I have tried all keys for extractMetadata(key). Am I skipping/missing something? Code basis: MediaMetadataRetriever f = new MediaMetadataRetriever(); f.setDataSource(item.getFilePath()); String title = f.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE); I do get correct values with the duration key (MediaMetadataRetriever.METADATA_KEY_DURATION) and mimetype key (MediaMetadataRetriever.METADATA_KEY_MIMETYPE), which indicates that the datasource/filepath is working. Poweramp
  • 检测视频是否以纵向/横向拍摄(Detecting if video was taken in portrait/landscape)
    问题 我想确认我正在做的确实是正确的方法,因为某些元素的行为出乎意料。 首先,我有横向和纵向布局,据我所知,这样做会自动检测手机是否处于纵向/横向模式: - layout - activity_video_player.xml - layout-land - activity_video_player.xml 然后,当用户从图库中选择视频时,我通过执行此操作(在OnCreate )检查视频是横向还是纵向: int w; int h; MediaMetadataRetriever mediaMetadataRetriever = new MediaMetadataRetriever(); mediaMetadataRetriever.setDataSource(this, videoURI); String height = mediaMetadataRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT); String width = mediaMetadataRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH); w = Integer.parseInt(width); h =
  • 如何确保录制视频的播放方向正确?(How can I ensure correct playback orientation of recorded video?)
    问题 我正在使用 MediaStore.ACTION_VIDEO_CAPTURE 意图来捕获视频,然后使用VideoView播放它。 我想知道拍摄的视频的方向。 我不想在意图调用时使用方向,因为用户可能会在按下快门按钮之前旋转设备。 我也不想实现我自己的自定义视频捕获。 视频的方向是否存储在保存的文件中和/或在意图结果中返回? 回答1 视频的方向是否存储在保存的文件中和/或在意图结果中返回? AOSP VideoCamera活动确实将相机设备的旋转值提供给MediaRecorder.setOrientationHint()方法。 以下是与此相关的 VideoCamera.initializeRecorder() 代码中的代码摘录: // See android.hardware.Camera.Parameters.setRotation for // documentation. // Note that mOrientation here is the device orientation, which is // the opposite of what getWindowManager().getDefaultDisplay().getRotation() // would return, which is the orientation the graphics need
  • Get multiple thumbnails from video
    I'm using MediaMetadataRetriever to retrieve thumbnails at a specific time in video. This is how I achieve this: MediaMetadataRetriever metadataRetriever = new MediaMetadataRetriever(); try { metadataRetriever.setDataSource(MainActivity.this, Uri.parse("android.resource://packageName/raw/"+"test")); String duration=metadataRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION); long time = Long.valueOf(duration)/3; Bitmap bitmap1 = metadataRetriever.getFrameAtTime(time,MediaMetadataRetriever.OPTION_CLOSEST_SYNC); imgone.setImageBitmap(bitmap1); }catch (Exception ex) { Toast