Spanish [SOLUCIONADO] Thumbnail de un vídeo

tomky

Active Member
Licensed User
Hola.

¿Cómo se consigue capturar uno de los primeros frames de un vídeo, ya sea que esté en el dispositivo o bien se reproduzca de internet?
La idea es ponerlo como imagen representativa de ese vídeo, para empezar a reproducirlo desde ahí.

¿Se debe poner el resultado en un imageview encima del videoview de la librería Audio?

Gracias.
 

tomky

Active Member
Licensed User
Gracias dar2o3.
Justo eso estaba probando ahora, pero me da el error:
B4X:
** Activity (main) Resume **
true
main_videorecorder_recordcomplete (java line: 452)
java.lang.IllegalArgumentException
    at android.media.MediaMetadataRetriever.setDataSource(MediaMetadataRetriever.java:68)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:511)
    at anywheresoftware.b4a.agraham.reflection.Reflection.runmethod(Reflection.java:216)
    at anywheresoftware.b4a.agraham.reflection.Reflection.RunMethod2(Reflection.java:817)
    at b4a.vrapp.main._videorecorder_recordcomplete(main.java:452)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:511)
    at anywheresoftware.b4a.BA.raiseEvent2(BA.java:169)
    at anywheresoftware.b4a.BA$2.run(BA.java:328)
    at android.os.Handler.handleCallback(Handler.java:725)
    at android.os.Handler.dispatchMessage(Handler.java:92)
    at android.os.Looper.loop(Looper.java:176)
    at android.app.ActivityThread.main(ActivityThread.java:5319)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:511)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
    at dalvik.system.NativeStart.main(Native Method)
java.lang.IllegalArgumentException

Y mirando sobre el error en este hilo https://www.b4x.com/android/forum/t...triever-setdatasource-with-uri.43009/#content
no dan ninguna solución.

Estoy probándolo en un dispositivo con Android 4.2.2, que no tiene SD externa, cambiándolo a File.DirInternal.

Saludos.
 
Last edited:

bgsoft

Well-Known Member
Licensed User
Longtime User
Hola:

El link que te pasó Dar2o3 es correcto y funciona.

Estoy probándolo en un dispositivo con Android 4.2.2, que no tiene SD externa, cambiándolo a File.DirInternal.
No se que uso le das a File.DirInternal , pero ten en cuenta que es de solo lectura.

Puedes compilar en modo debug y ver en que linea de código te da el error, si aun con esto no ves claro por que te da el error, puedes escribir aqui esa parte de código, asi podremos ver si hay algun error

Saludos:
 

tomky

Active Member
Licensed User
Gracias a los 2.
Teníais razón.

El problema era ese, que no sabíamos que File.DirInternal es de solo lectura.
Lo cambiamos por File.DirDefaultExternal.
Copiamos el archivo original de DirAssets ahí para poder reproducirlo.

Y sobre la segunda pregunta que hice, ¿se puede poner el imageView con la imagen de la captura encima del videoView, y a su vez un label semitransparente con la flecha de reproducción encima de ese imageView? ¿Es lo correcto?

Saludos
 
Last edited:

tomky

Active Member
Licensed User
Perdón, ese era otro ejercicio.

Me sigue dando el mismo error en éste.

Mi código es:
B4X:
Sub Process_Globals
    Dim audioRecorder As AudioRecordApp
    Dim videoRecorder As VideoRecordApp
End Sub

Sub Globals
    Dim vv As VideoView
 
    Dim vidfile As String
End Sub

Sub Activity_Create(FirstTime As Boolean)
   If FirstTime Then
        audioRecorder.Initialize("audioRecorder")
        videoRecorder.Initialize("videoRecorder")
    End If
    vv.Initialize("vv")
    Activity.AddView(vv, 0, 0, 100%x, 100%y)
    Activity.AddMenuItem("Record Video", "RecordVideo")
    Activity.AddMenuItem("Record Audio", "RecordAudio")
    ToastMessageShow("Press on Menu button...", True)
End Sub

Sub RecordVideo_Click
 
    '    vidfile = File.Combine(File.DirRootExternal, "1.mp4")    'Si tienes SD
    vidfile = File.Combine(File.DirDefaultExternal, "1.mp4")

'    videoRecorder.Record(File.DirRootExternal, "1.mp4")
    videoRecorder.Record(File.DirDefaultExternal, "1.mp4")
End Sub

Sub RecordAudio_Click
'    audioRecorder.Record(File.DirRootExternal, "1.3gpp")
    audioRecorder.Record(File.DirDefaultExternal, "1.3gpp")
End Sub

Sub videoRecorder_RecordComplete (Success As Boolean)
    Log(Success)
    If Success Then
'        vv.LoadVideo(File.DirRootExternal, "1.mp4")
'        vv.Play

      Dim rfl As Reflector
      Dim obj As Object
      Dim b As Bitmap
   
      obj = rfl.CreateObject("android.media.MediaMetadataRetriever")
      rfl.Target = obj
      rfl.RunMethod2("setDataSource", vidfile, "java.lang.String")
      b = rfl.RunMethod3("getFrameAtTime", 0, "java.lang.long", 3, "java.lang.int")
   
      Dim i, j, h, w As Int
      Dim iv As ImageView
   
      i = b.Height * 0.3
      j = b.Width * 0.5
      h = Activity.Height
      w = Activity.Width
   
      iv.Initialize("")
      Activity.AddView(iv, (w - j) / 2, (h - i) / 3, j, i)
      iv.Bitmap = b
    End If
End Sub

Sub audioRecorder_RecordComplete (Success As Boolean)
    Log(Success)
    If Success Then
'        vv.LoadVideo(File.DirRootExternal, "1.3gpp")    'Si tienes SD
        vv.LoadVideo(File.DirDefaultExternal, "1.3gpp")
        vv.Play
    End If
End Sub

Sub Activity_Resume
End Sub

Sub Activity_Pause (UserClosed As Boolean)
End Sub

Gracias.
 

dar2o3

Active Member
Licensed User
Longtime User
Has probado el ejemplo del link sin tocar nada y no te funciona?

Prueba el ejemplo, si cogemos algo y lo trasladamos a nuestro proyecto sin probarlo antes es harto complicado descubrir de donde puede venir el problema, pude ser desde un problema de permisos hasta librerías no actualizadas en tu sistema.
 

moster67

Expert
Licensed User
Longtime User
Sorry but I don't know Spanish so I write in English..

Does the video play in VideoView? if yes and if you don't find a solution, you could try my B4ATextureVideoView wrapper which is nearly identical to the standard VideoView except for the fact that it is using a TextureView instead of a SurfaceView. With this wrapper you can save bitmaps (thanks to the TextureView). You could use this feature and generate thumbnails.

If your video does not play (due to problems with video codecs perhaps), you could try Vitamio5 which plays most videos and also lets you save bitmaps.

Another solution could be my ffmpegencoder-library (which I have not yet released but available for beta-testing if you wish). With this library you can manipulate videos/audio. The only disadvantage is that the library is big although these days it is not much of a problem.
 

bgsoft

Well-Known Member
Licensed User
Longtime User
Hola

Y sobre la segunda pregunta que hice, ¿se puede poner el imageView con la imagen de la captura encima del videoView, y a su vez un label semitransparente con la flecha de reproducción encima de ese imageView? ¿Es lo correcto?

Si, cuando cargues la imagen haz un BringToFront y así se pondrá encima.
Para hacerlo semitransparente hazlo asi:

B4X:
  ' Transparente es un valor de 0 a 255, 0 = totalmente transparente, 255 = opaco
  label1.Color = Colors.ARGB(Transparente,r,g,b)

Con respecto a que te da error, hazle caso a Dar2o3

Saludos
 

tomky

Active Member
Licensed User
Sí dar2o3, lo he probado sin tocar nada del código original en otro móvil, con Marshmallow (API 23) y tarjeta externa, y funciona, pero la imagen queda mal cortada.
Para el otro móvil con Jelly Bean (API 17) y sin tarjeta externa, solamente cambié como viste DirRootExternal por DirDefaultExternal, y no funciona.

Utilizo las librerías Core 6.50, Audio 1.63 y Reflection 2.40.

Saludos.
 

tomky

Active Member
Licensed User
Thanks monster67.

There is no problem with the language.
I have tested your B4ATextureVideoView library and it works. But is it necessary to use a timer not to capture the first frame, which is sometimes black?

I have not looked at the other libraries yet, but I'll keep that in mind.

Thank you.
 

tomky

Active Member
Licensed User
Al final lo solucioné con el enlace que me dió dar2o3, en el post 2 de este hilo.
Gracias.
 
Top