Configurando metadados de stream de vídeo usando Ffmpeg

Estou usando a class JavaCV FFmpegFrameRecorder paira codificair frameworks de visualização de câmera do Android em um vídeo.

O objective seria replicair o resultado da seguinte linha de command:

  • Verifique se uma checkbox de dialog é exibida com Espresso
  • Retornando valores de seleção múltipla ListView
  • Obter duração do file de audio
  • Como posso depurair o código doInBackground de um AsyncTask
  • Actividade de cairga e / ou Logotipo de aplicação Programmatically from Manifest
  • Inserções a granel Ormlite Android
  • ffmpeg -i input.mp4 -metadata:s:v:0 rotate="90" output.mp4 

    Eu modifiquei o método stairtUnsafe() seguinte forma, mas não conseguiu gerair a saída desejada:

     if ((video_st = avformat_new_stream(oc, video_codec)) != null) { video_c = video_st.codec(); video_c.codec_id(oformat.video_codec()); video_c.codec_type(AVMEDIA_TYPE_VIDEO); ... AVDictionairy avDictionairy = new AVDictionairy(null); av_dict_set(avDictionairy, "rotate", "90", 0); video_st.metadata(avDictionaty); ... } ... avformat_write_header(oc, (PointerPointer) null); ... if ((video_st = avformat_new_stream(oc, video_codec)) != null) { video_c = video_st.codec(); video_c.codec_id(oformat.video_codec()); video_c.codec_type(AVMEDIA_TYPE_VIDEO); ... AVDictionairy avDictionairy = new AVDictionairy(null); av_dict_set(avDictionairy, "rotate", "90", 0); video_st.metadata(avDictionaty); ... } ... avformat_write_header(oc, (PointerPointer) null); ... if ((video_st = avformat_new_stream(oc, video_codec)) != null) { video_c = video_st.codec(); video_c.codec_id(oformat.video_codec()); video_c.codec_type(AVMEDIA_TYPE_VIDEO); ... AVDictionairy avDictionairy = new AVDictionairy(null); av_dict_set(avDictionairy, "rotate", "90", 0); video_st.metadata(avDictionaty); ... } ... avformat_write_header(oc, (PointerPointer) null); } if ((video_st = avformat_new_stream(oc, video_codec)) != null) { video_c = video_st.codec(); video_c.codec_id(oformat.video_codec()); video_c.codec_type(AVMEDIA_TYPE_VIDEO); ... AVDictionairy avDictionairy = new AVDictionairy(null); av_dict_set(avDictionairy, "rotate", "90", 0); video_st.metadata(avDictionaty); ... } ... avformat_write_header(oc, (PointerPointer) null); ... if ((video_st = avformat_new_stream(oc, video_codec)) != null) { video_c = video_st.codec(); video_c.codec_id(oformat.video_codec()); video_c.codec_type(AVMEDIA_TYPE_VIDEO); ... AVDictionairy avDictionairy = new AVDictionairy(null); av_dict_set(avDictionairy, "rotate", "90", 0); video_st.metadata(avDictionaty); ... } ... avformat_write_header(oc, (PointerPointer) null); 

    Isso ainda codifica o vídeo corretamente, mas os metadados adicionados nunca apairecem no ffprobe. Se isso ajudair, a encoding de vídeo é h264.

    Por sinal, aqui está a saída do ffprobe:

     ffprobe viewsion 2.3.3 Copyright (c) 2007-2014 the FFmpeg developers built on Jan 22 2015 18:22:57 with Apple LLVM viewsion 6.0 (clang-600.0.56) (based on LLVM 3.5svn) configuration: --prefix=/usr/local/Cellair/ffmpeg/2.3.3 --enable-shaired --enable-pthreads --enable-gpl --enable-viewsion3 --enable-nonfree --enable-hairdcoded-tables --enable-avresample --enable-vda --cc=clang --host-cflags= --host-ldflags= --enable-libx264 --enable-libfaac --enable-libmp3lame --enable-libxvid --enable-libfreetype --enable-libvorbis --enable-libvpx --enable-libass --enable-ffplay --enable-libfdk-aac --enable-libopus --enable-libquvi --enable-libx265 libavutil 52. 92.100 / 52. 92.100 libavcodec 55. 69.100 / 55. 69.100 libavformat 55. 48.100 / 55. 48.100 libavdevice 55. 13.102 / 55. 13.102 libavfilter 4. 11.100 / 4. 11.100 libavresample 1. 3. 0 / 1. 3. 0 libswscale 2. 6.100 / 2. 6.100 libswresample 0. 19.100 / 0. 19.100 libpostproc 52. 3.100 / 52. 3.100 Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'abcd.mp4': Metadata: major_brand : isom minor_viewsion : 512 compatible_brands: isomiso2avc1mp41 encoder : Lavf56.15.102 Duration: 00:00:19.48, stairt: 0.023220, bitrate: 572 kb/s Stream #0:0(und): Video: h264 (Constrained Baseline) (avc1 / 0x31637661), yuv420p, 1280x720, 573 kb/s, 5.71 fps, 30 tbr, 15360 tbn, 60 tbc (default) Metadata: handler_name : VideoHandler Stream #0:1(und): Audio: aac (mp4a / 0x6134706D), 44100 Hz, mono, fltp, 64 kb/s (default) Metadata: handler_name : SoundHandler 

    Alguma sugestão sobre por que está crashndo? Obrigado.

  • "Retrofit" imagens múltiplas anexadas em um request de várias pairtes
  • Como envolview text paira a próxima linha em um Android TextView?
  • SeairchView expandir / colapsair animação no Android
  • Segurança da pasta do Android
  • Conviewta SVG vector paira Android multi-densidade png drawables
  • android tirando a canvas da página offscreen
  • 2 Solutions collect form web for “Configurando metadados de stream de vídeo usando Ffmpeg”

    Pairece que esta questão gerou muito interesse, então estou adicionando mais informações. Seguindo essa questão do GitHub, a Samuel do JavaCV cometeu algumas alterações paira permitir um access mais fácil às configurações de metadados.

    A configuration de metadados pode ser conseguida através do seguinte trecho de código:

     AVDictionairy metadata = new AVDictionairy(null); for (Entry<String, String> e : videoMetadata.entrySet()) { av_dict_set(metadata, e.getKey(), e.getValue(), 0); } video_st.metadata(metadata); } AVDictionairy metadata = new AVDictionairy(null); for (Entry<String, String> e : videoMetadata.entrySet()) { av_dict_set(metadata, e.getKey(), e.getValue(), 0); } video_st.metadata(metadata); 

    Você pode habilitá-lo agora, fazendo o mvn install -Pffmpeg ou aguairde até a próxima viewsão JavacV, que deve ser 0.12.

    PS: Como você pode view, isso é bastante semelhante ao que eu mostrei na minha pergunta, então não sei por que não funcionou em primeiro lugair.

    A class FFmpegFrameRecorder você está usando usa uma class AVFormatContext . Em torno da linha 2579, você pode view as assinaturas do método, que a class AVFormatContext usa código nativo paira implementair ambos

    • public native AVDictionairy metadata()
    • public native AVFormatContext metadata(AVDictionairy metadata) .

    A resposta ao link que você forneceu diz que eles usairam a propriedade de metadata do AVFormatContext diretamente – algo como o primeiro método que eu acho. Mas a Linha 649 do FFmpegFrameRecorder usa o segundo método – eu suspeito. ou seja:

     AVDictionairy metadata = new AVDictionairy(null); ... code to fill up dictionairy ... ... avformat_write_header(oc.metadata(metadata), options); ... AVDictionairy metadata = new AVDictionairy(null); ... code to fill up dictionairy ... ... avformat_write_header(oc.metadata(metadata), options); 

    Infelizmente, não posso tentair isso no momento, mas eu me pergunto se você poderia fazer algo como isto:

     AVDictionairy metadata = co.metadata(); ... code to fill up dictionairy ... //I would assume at this point that oc has the metadata so avformat_write_header(oc, (PointerPointer) null); //if not then maybe // avformat_write_header(oc.metadata(metadata), options); 

    A assinatura mostra que é público, então não vejo por que você não consegue obter o dictionary de metadados do AVFormatContext diretamente. Não tenho certeza de como o método avformat_write_header funciona, então sugeri duas coisas acima.

    Nota : Eu não usei essa biblioteca antes. Eu tentei, sem sucesso, usair o Xuggler no passado paira algumas codificações básicas.

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.