Recherche avancée

Médias (1)

Mot : - Tags -/bug

Autres articles (49)

  • HTML5 audio and video support

    13 avril 2011, par

    MediaSPIP uses HTML5 video and audio tags to play multimedia files, taking advantage of the latest W3C innovations supported by modern browsers.
    The MediaSPIP player used has been created specifically for MediaSPIP and can be easily adapted to fit in with a specific theme.
    For older browsers the Flowplayer flash fallback is used.
    MediaSPIP allows for media playback on major mobile platforms with the above (...)

  • List of compatible distributions

    26 avril 2011, par

    The table below is the list of Linux distributions compatible with the automated installation script of MediaSPIP. Distribution nameVersion nameVersion number Debian Squeeze 6.x.x Debian Weezy 7.x.x Debian Jessie 8.x.x Ubuntu The Precise Pangolin 12.04 LTS Ubuntu The Trusty Tahr 14.04
    If you want to help us improve this list, you can provide us access to a machine whose distribution is not mentioned above or send the necessary fixes to add (...)

  • Selection of projects using MediaSPIP

    2 mai 2011, par

    The examples below are representative elements of MediaSPIP specific uses for specific projects.
    MediaSPIP farm @ Infini
    The non profit organizationInfini develops hospitality activities, internet access point, training, realizing innovative projects in the field of information and communication technologies and Communication, and hosting of websites. It plays a unique and prominent role in the Brest (France) area, at the national level, among the half-dozen such association. Its members (...)

Sur d’autres sites (7979)

  • ffmpeg encoding, Opus sound in the webm container does not work

    10 mars 2019, par Mockarutan

    I’m trying to encode audio and video to a webm file with VP8 and Opus encoding. It almost works. (I use FFmpeg 3.3.2)

    I can make a only video webm file and play it in VLC, FFPlay and upload it to YouTube (and all works). If I add Opus sound to the file, it still works in VLC but not in FFPlay or on youtube, on youtube the sound becomes just "ticks".

    I have the same problem if I encode only Opus audio to the webm file ; it only works in VLC. But if I encode only Opus audio to a ogg container it works everywhere, and I can even use FFmpeg to combine the ogg file with a video only webm file and produce a fully working webm file with audio and video.

    So it seems to me that only when I use my code to encode Opus into a webm container, it just wont work in most players and YouTube. I need it to work in youtube.

    Here is the code for the opus to webm only encoding (you can toggle ogg/webm with the define) : https://pastebin.com/jyQ4s3tB

    #include <algorithm>
    #include <iterator>

    extern "C"
    {

    //#define OGG

    #include "libavcodec/avcodec.h"
    #include "libavdevice/avdevice.h"
    #include "libavfilter/avfilter.h"
    #include "libavformat/avformat.h"
    #include "libavutil/avutil.h"
    #include "libavutil/imgutils.h"
    #include "libswscale/swscale.h"
    #include "libswresample/swresample.h"

       enum InfoCodes
       {
           ENCODED_VIDEO,
           ENCODED_AUDIO,
           ENCODED_AUDIO_AND_VIDEO,
           NOT_ENOUGH_AUDIO_DATA,
       };

       enum ErrorCodes
       {
           RES_NOT_MUL_OF_TWO = -1,
           ERROR_FINDING_VID_CODEC = -2,
           ERROR_CONTEXT_CREATION = -3,
           ERROR_CONTEXT_ALLOCATING = -4,
           ERROR_OPENING_VID_CODEC = -5,
           ERROR_OPENING_FILE = -6,
           ERROR_ALLOCATING_FRAME = -7,
           ERROR_ALLOCATING_PIC_BUF = -8,
           ERROR_ENCODING_FRAME_SEND = -9,
           ERROR_ENCODING_FRAME_RECEIVE = -10,
           ERROR_FINDING_AUD_CODEC = -11,
           ERROR_OPENING_AUD_CODEC = -12,
           ERROR_INIT_RESMPL_CONTEXT = -13,
           ERROR_ENCODING_SAMPLES_SEND = -14,
           ERROR_ENCODING_SAMPLES_RECEIVE = -15,
           ERROR_WRITING_HEADER = -16,
           ERROR_INIT_AUDIO_RESPAMLER = -17,
       };

       AVCodecID aud_codec_comp_id = AV_CODEC_ID_OPUS;
       AVSampleFormat sample_fmt_comp = AV_SAMPLE_FMT_FLT;

       AVCodecID aud_codec_id;
       AVSampleFormat sample_fmt;

    #ifndef OGG
       char* compressed_cont = "webm";
    #endif
    #ifdef OGG
       char* compressed_cont = "ogg";
    #endif

       AVCodec *aud_codec = NULL;
       AVCodecContext *aud_codec_context = NULL;
       AVFormatContext *outctx;
       AVStream *audio_st;
       AVFrame *aud_frame;
       SwrContext *audio_swr_ctx;

       int vid_frame_counter, aud_frame_counter;
       int vid_width, vid_height;

       char* concat(const char *s1, const char *s2)
       {
           char *result = (char*)malloc(strlen(s1) + strlen(s2) + 1);

           strcpy(result, s1);
           strcat(result, s2);

           return result;
       }

       int setup_audio_codec()
       {
           aud_codec_id = aud_codec_comp_id;
           sample_fmt = sample_fmt_comp;

           // Fixup audio codec
           if (aud_codec == NULL)
           {
               aud_codec = avcodec_find_encoder(aud_codec_id);
               avcodec_register(aud_codec);
           }

           if (!aud_codec)
               return ERROR_FINDING_AUD_CODEC;

           return 0;
       }

       int initialize_audio_stream(AVFormatContext *local_outctx, int sample_rate, int per_frame_audio_samples, int audio_bitrate)
       {
           aud_codec_context = avcodec_alloc_context3(aud_codec);
           if (!aud_codec_context)
               return ERROR_CONTEXT_CREATION;

           aud_codec_context->bit_rate = audio_bitrate;
           aud_codec_context->sample_rate = sample_rate;
           aud_codec_context->sample_fmt = sample_fmt;
           aud_codec_context->channel_layout = AV_CH_LAYOUT_STEREO;
           aud_codec_context->channels = av_get_channel_layout_nb_channels(aud_codec_context->channel_layout);
           //aud_codec_context->profile = FF_PROFILE_AAC_MAIN;

           aud_codec_context->codec = aud_codec;
           aud_codec_context->codec_id = aud_codec_id;

           AVRational time_base;
           time_base.num = per_frame_audio_samples;
           time_base.den = aud_codec_context->sample_rate;
           aud_codec_context->time_base = time_base;

           int ret = avcodec_open2(aud_codec_context, aud_codec, NULL);

           if (ret &lt; 0)
               return ERROR_OPENING_AUD_CODEC;

           local_outctx->audio_codec = aud_codec;
           local_outctx->audio_codec_id = aud_codec_id;

           audio_st = avformat_new_stream(local_outctx, aud_codec);

           audio_st->codecpar->bit_rate = aud_codec_context->bit_rate;
           audio_st->codecpar->sample_rate = aud_codec_context->sample_rate;
           audio_st->codecpar->channels = aud_codec_context->channels;
           audio_st->codecpar->channel_layout = aud_codec_context->channel_layout;
           audio_st->codecpar->codec_id = aud_codec_context->codec_id;
           audio_st->codecpar->codec_type = AVMEDIA_TYPE_AUDIO;
           audio_st->codecpar->format = aud_codec_context->sample_fmt;
           audio_st->codecpar->frame_size = aud_codec_context->frame_size;
           audio_st->codecpar->block_align = aud_codec_context->block_align;
           audio_st->codecpar->initial_padding = aud_codec_context->initial_padding;
           audio_st->codecpar->extradata = aud_codec_context->extradata;
           audio_st->codecpar->extradata_size = aud_codec_context->extradata_size;

           aud_frame = av_frame_alloc();
           aud_frame->nb_samples = aud_codec_context->frame_size;
           aud_frame->format = aud_codec_context->sample_fmt;
           aud_frame->channel_layout = aud_codec_context->channel_layout;
           aud_frame->sample_rate = aud_codec_context->sample_rate;

           int buffer_size;
           if (aud_codec_context->frame_size == 0)
           {
               buffer_size = per_frame_audio_samples * 2 * 4;
               aud_frame->nb_samples = per_frame_audio_samples;
           }
           else
           {
               buffer_size = av_samples_get_buffer_size(NULL, aud_codec_context->channels, aud_codec_context->frame_size,
                   aud_codec_context->sample_fmt, 0);
           }

           if (av_sample_fmt_is_planar(sample_fmt))
               ret = av_frame_get_buffer(aud_frame, buffer_size / 2);
           else
               ret = av_frame_get_buffer(aud_frame, buffer_size);

           if (!aud_frame || ret &lt; 0)
               return ERROR_ALLOCATING_FRAME;

           aud_frame_counter = 0;

           return 0;
       }

       int initialize_audio_only_encoding(int sample_rate, int per_frame_audio_samples, int audio_bitrate, const char *filename)
       {
           int ret;

           avcodec_register_all();
           av_register_all();

           outctx = avformat_alloc_context();

           char* with_dot = concat(filename, ".");
           char* full_filename = concat(with_dot, compressed_cont);

           ret = avformat_alloc_output_context2(&amp;outctx, NULL, compressed_cont, full_filename);

           free(with_dot);

           if (ret &lt; 0)
           {
               free(full_filename);
               return ERROR_CONTEXT_CREATION;
           }

           ret = setup_audio_codec();
           if (ret &lt; 0)
               return ret;

           // Setup Audio
           ret = initialize_audio_stream(outctx, sample_rate, per_frame_audio_samples, audio_bitrate);
           if (ret &lt; 0)
               return ret;

           av_dump_format(outctx, 0, full_filename, 1);

           if (!(outctx->oformat->flags &amp; AVFMT_NOFILE))
           {
               if (avio_open(&amp;outctx->pb, full_filename, AVIO_FLAG_WRITE) &lt; 0)
               {
                   free(full_filename);
                   return ERROR_OPENING_FILE;
               }
           }

           free(full_filename);

           ret = avformat_write_header(outctx, NULL);
           if (ret &lt; 0)
               return ERROR_WRITING_HEADER;

           return 0;
       }

       int write_interleaved_audio_frame(float_t *aud_sample)
       {
           int ret;

           aud_frame->data[0] = (uint8_t*)aud_sample;
           aud_frame->extended_data[0] = (uint8_t*)aud_sample;

           aud_frame->pts = aud_frame_counter++;

           ret = avcodec_send_frame(aud_codec_context, aud_frame);

           AVPacket pkt;
           av_init_packet(&amp;pkt);
           pkt.data = NULL;
           pkt.size = 0;

           while (true)
           {
               ret = avcodec_receive_packet(aud_codec_context, &amp;pkt);
               if (!ret)
               {
                   av_packet_rescale_ts(&amp;pkt, aud_codec_context->time_base, audio_st->time_base);

                   pkt.stream_index = audio_st->index;

                   av_interleaved_write_frame(outctx, &amp;pkt);

                   av_packet_unref(&amp;pkt);
               }
               if (ret == AVERROR(EAGAIN))
                   break;
               else if (ret &lt; 0)
                   return ERROR_ENCODING_SAMPLES_RECEIVE;
               else
                   break;
           }

           return ENCODED_AUDIO;
       }

       int write_audio_frame(float_t *aud_sample)
       {
           int ret;
           aud_frame->data[0] = (uint8_t*)aud_sample;
           aud_frame->extended_data[0] = (uint8_t*)aud_sample;

           aud_frame->pts = aud_frame_counter++;

           ret = avcodec_send_frame(aud_codec_context, aud_frame);
           if (ret &lt; 0)
               return ERROR_ENCODING_FRAME_SEND;

           AVPacket pkt;
           av_init_packet(&amp;pkt);
           pkt.data = NULL;
           pkt.size = 0;

           fflush(stdout);

           while (true)
           {
               ret = avcodec_receive_packet(aud_codec_context, &amp;pkt);
               if (!ret)
                   if (pkt.pts != AV_NOPTS_VALUE)
                       pkt.pts = av_rescale_q(pkt.pts, aud_codec_context->time_base, audio_st->time_base);
               if (pkt.dts != AV_NOPTS_VALUE)
                   pkt.dts = av_rescale_q(pkt.dts, aud_codec_context->time_base, audio_st->time_base);
               {

                   av_write_frame(outctx, &amp;pkt);
                   av_packet_unref(&amp;pkt);
               }
               if (ret == AVERROR(EAGAIN))
                   break;
               else if (ret &lt; 0)
                   return ERROR_ENCODING_FRAME_RECEIVE;
               else
                   break;
           }

           return ENCODED_AUDIO;
       }

       int finish_audio_encoding()
       {
           AVPacket pkt;
           av_init_packet(&amp;pkt);
           pkt.data = NULL;
           pkt.size = 0;

           fflush(stdout);

           int ret = avcodec_send_frame(aud_codec_context, NULL);
           if (ret &lt; 0)
               return ERROR_ENCODING_FRAME_SEND;

           while (true)
           {
               ret = avcodec_receive_packet(aud_codec_context, &amp;pkt);
               if (!ret)
               {
                   if (pkt.pts != AV_NOPTS_VALUE)
                       pkt.pts = av_rescale_q(pkt.pts, aud_codec_context->time_base, audio_st->time_base);
                   if (pkt.dts != AV_NOPTS_VALUE)
                       pkt.dts = av_rescale_q(pkt.dts, aud_codec_context->time_base, audio_st->time_base);

                   av_write_frame(outctx, &amp;pkt);
                   av_packet_unref(&amp;pkt);
               }
               if (ret == -AVERROR(AVERROR_EOF))
                   break;
               else if (ret &lt; 0)
                   return ERROR_ENCODING_FRAME_RECEIVE;
           }

           av_write_trailer(outctx);

           return 0;
       }

       void cleanup()
       {
           if (aud_frame)
           {
               av_frame_free(&amp;aud_frame);
           }
           if (outctx)
           {
               for (int i = 0; i &lt; outctx->nb_streams; i++)
                   av_freep(&amp;outctx->streams[i]);

               avio_close(outctx->pb);
               av_free(outctx);
           }

           if (aud_codec_context)
           {
               avcodec_close(aud_codec_context);
               av_free(aud_codec_context);
           }
       }

       void fill_samples(float_t *dst, int nb_samples, int nb_channels, int sample_rate, float_t *t)
       {
           int i, j;
           float_t tincr = 1.0 / sample_rate;
           const float_t c = 2 * M_PI * 440.0;

           for (i = 0; i &lt; nb_samples; i++) {
               *dst = sin(c * *t);
               for (j = 1; j &lt; nb_channels; j++)
                   dst[j] = dst[0];
               dst += nb_channels;
               *t += tincr;
           }
       }

       int main()
       {
           int sec = 5;
           int frame_rate = 30;
           float t = 0, tincr = 0, tincr2 = 0;

           int src_samples_linesize;
           int src_nb_samples = 960;
           int src_channels = 2;
           int sample_rate = 48000;

           uint8_t **src_data = NULL;

           int ret;

           initialize_audio_only_encoding(48000, src_nb_samples, 192000, "sound_FLT_960");

           ret = av_samples_alloc_array_and_samples(&amp;src_data, &amp;src_samples_linesize, src_channels,
               src_nb_samples, AV_SAMPLE_FMT_FLT, 0);

           for (size_t i = 0; i &lt; frame_rate * sec; i++)
           {
                   fill_samples((float *)src_data[0], src_nb_samples, src_channels, sample_rate, &amp;t);
                   write_interleaved_audio_frame((float *)src_data[0]);
           }

           finish_audio_encoding();

           cleanup();

           return 0;
       }
    }
    </iterator></algorithm>

    And some of the files :

    The webm audio file that does not work (only in VLC) :
    https://drive.google.com/file/d/0B16rIXjPXJCqcU5HVllIYW1iODg/view?usp=sharing

    The ogg audio file that works :
    https://drive.google.com/file/d/0B16rIXjPXJCqMUZhbW0tTDFjT1E/view?usp=sharing

    Video and Audio file that only works in VLC : https://drive.google.com/file/d/0B16rIXjPXJCqX3pEN3B0QVlrekU/view?usp=sharing

    If a play the ogg file in FFPlay it says "aq= 30kb", but if I play the webm audio only file i get "aq= 0kb". So that does not seem right either.

    Any idea ? Thanks in advance !

    Edit : So I made it work by just encoding both VP8 and Opus into the ogg container and then simply renaming it to .webm and uploading it YouTube. I did not actually know ogg could have video inside of it. I do not really know what how it affects the encoding and stuff... I can upload the original ogg file with video and it also works on YouTube. But the whole reason I went for webm was the licensing it has (https://www.webmproject.org/license/)... So I’m a bit confused now.

    I need to read up on what exactly a "container" means in the context and what just changing the extension means.

    Any comments to shed some light on this appreciated !

  • ffmpeg enciding, Opus sound in the webm container does not work

    2 juillet 2017, par Mockarutan

    I’m trying to encode audio and video to a webm file with VP8 and Opus encoding. It almost works. (I use FFmpeg 3.3.2)

    I can make a only video webm file and play it in VLC, FFPlay and upload it to YouTube (and all works). If I add Opus sound to the file, it still works in VLC but not in FFPlay or on youtube, on youtube the sound becomes just "ticks".

    I have the same problem if I encode only Opus audio to the webm file ; it only works in VLC. But if I encode only Opus audio to a ogg container it works everywhere, and I can even use FFmpeg to combine the ogg file with a video only webm file and produce a fully working webm file with audio and video.

    So it seems to me that only when I use my code to encode Opus into a webm container, it just wont work in most players and YouTube. I need it to work in youtube.

    Here is the code for the opus to webm only encoding (you can toggle ogg/webm with the define) : https://pastebin.com/jyQ4s3tB

    #include <algorithm>
    #include <iterator>

    extern "C"
    {

    //#define OGG

    #include "libavcodec/avcodec.h"
    #include "libavdevice/avdevice.h"
    #include "libavfilter/avfilter.h"
    #include "libavformat/avformat.h"
    #include "libavutil/avutil.h"
    #include "libavutil/imgutils.h"
    #include "libswscale/swscale.h"
    #include "libswresample/swresample.h"

       enum InfoCodes
       {
           ENCODED_VIDEO,
           ENCODED_AUDIO,
           ENCODED_AUDIO_AND_VIDEO,
           NOT_ENOUGH_AUDIO_DATA,
       };

       enum ErrorCodes
       {
           RES_NOT_MUL_OF_TWO = -1,
           ERROR_FINDING_VID_CODEC = -2,
           ERROR_CONTEXT_CREATION = -3,
           ERROR_CONTEXT_ALLOCATING = -4,
           ERROR_OPENING_VID_CODEC = -5,
           ERROR_OPENING_FILE = -6,
           ERROR_ALLOCATING_FRAME = -7,
           ERROR_ALLOCATING_PIC_BUF = -8,
           ERROR_ENCODING_FRAME_SEND = -9,
           ERROR_ENCODING_FRAME_RECEIVE = -10,
           ERROR_FINDING_AUD_CODEC = -11,
           ERROR_OPENING_AUD_CODEC = -12,
           ERROR_INIT_RESMPL_CONTEXT = -13,
           ERROR_ENCODING_SAMPLES_SEND = -14,
           ERROR_ENCODING_SAMPLES_RECEIVE = -15,
           ERROR_WRITING_HEADER = -16,
           ERROR_INIT_AUDIO_RESPAMLER = -17,
       };

       AVCodecID aud_codec_comp_id = AV_CODEC_ID_OPUS;
       AVSampleFormat sample_fmt_comp = AV_SAMPLE_FMT_FLT;

       AVCodecID aud_codec_id;
       AVSampleFormat sample_fmt;

    #ifndef OGG
       char* compressed_cont = "webm";
    #endif
    #ifdef OGG
       char* compressed_cont = "ogg";
    #endif

       AVCodec *aud_codec = NULL;
       AVCodecContext *aud_codec_context = NULL;
       AVFormatContext *outctx;
       AVStream *audio_st;
       AVFrame *aud_frame;
       SwrContext *audio_swr_ctx;

       int vid_frame_counter, aud_frame_counter;
       int vid_width, vid_height;

       char* concat(const char *s1, const char *s2)
       {
           char *result = (char*)malloc(strlen(s1) + strlen(s2) + 1);

           strcpy(result, s1);
           strcat(result, s2);

           return result;
       }

       int setup_audio_codec()
       {
           aud_codec_id = aud_codec_comp_id;
           sample_fmt = sample_fmt_comp;

           // Fixup audio codec
           if (aud_codec == NULL)
           {
               aud_codec = avcodec_find_encoder(aud_codec_id);
               avcodec_register(aud_codec);
           }

           if (!aud_codec)
               return ERROR_FINDING_AUD_CODEC;

           return 0;
       }

       int initialize_audio_stream(AVFormatContext *local_outctx, int sample_rate, int per_frame_audio_samples, int audio_bitrate)
       {
           aud_codec_context = avcodec_alloc_context3(aud_codec);
           if (!aud_codec_context)
               return ERROR_CONTEXT_CREATION;

           aud_codec_context->bit_rate = audio_bitrate;
           aud_codec_context->sample_rate = sample_rate;
           aud_codec_context->sample_fmt = sample_fmt;
           aud_codec_context->channel_layout = AV_CH_LAYOUT_STEREO;
           aud_codec_context->channels = av_get_channel_layout_nb_channels(aud_codec_context->channel_layout);
           //aud_codec_context->profile = FF_PROFILE_AAC_MAIN;

           aud_codec_context->codec = aud_codec;
           aud_codec_context->codec_id = aud_codec_id;

           AVRational time_base;
           time_base.num = per_frame_audio_samples;
           time_base.den = aud_codec_context->sample_rate;
           aud_codec_context->time_base = time_base;

           int ret = avcodec_open2(aud_codec_context, aud_codec, NULL);

           if (ret &lt; 0)
               return ERROR_OPENING_AUD_CODEC;

           local_outctx->audio_codec = aud_codec;
           local_outctx->audio_codec_id = aud_codec_id;

           audio_st = avformat_new_stream(local_outctx, aud_codec);

           audio_st->codecpar->bit_rate = aud_codec_context->bit_rate;
           audio_st->codecpar->sample_rate = aud_codec_context->sample_rate;
           audio_st->codecpar->channels = aud_codec_context->channels;
           audio_st->codecpar->channel_layout = aud_codec_context->channel_layout;
           audio_st->codecpar->codec_id = aud_codec_context->codec_id;
           audio_st->codecpar->codec_type = AVMEDIA_TYPE_AUDIO;
           audio_st->codecpar->format = aud_codec_context->sample_fmt;
           audio_st->codecpar->frame_size = aud_codec_context->frame_size;
           audio_st->codecpar->block_align = aud_codec_context->block_align;
           audio_st->codecpar->initial_padding = aud_codec_context->initial_padding;
           audio_st->codecpar->extradata = aud_codec_context->extradata;
           audio_st->codecpar->extradata_size = aud_codec_context->extradata_size;

           aud_frame = av_frame_alloc();
           aud_frame->nb_samples = aud_codec_context->frame_size;
           aud_frame->format = aud_codec_context->sample_fmt;
           aud_frame->channel_layout = aud_codec_context->channel_layout;
           aud_frame->sample_rate = aud_codec_context->sample_rate;

           int buffer_size;
           if (aud_codec_context->frame_size == 0)
           {
               buffer_size = per_frame_audio_samples * 2 * 4;
               aud_frame->nb_samples = per_frame_audio_samples;
           }
           else
           {
               buffer_size = av_samples_get_buffer_size(NULL, aud_codec_context->channels, aud_codec_context->frame_size,
                   aud_codec_context->sample_fmt, 0);
           }

           if (av_sample_fmt_is_planar(sample_fmt))
               ret = av_frame_get_buffer(aud_frame, buffer_size / 2);
           else
               ret = av_frame_get_buffer(aud_frame, buffer_size);

           if (!aud_frame || ret &lt; 0)
               return ERROR_ALLOCATING_FRAME;

           aud_frame_counter = 0;

           return 0;
       }

       int initialize_audio_only_encoding(int sample_rate, int per_frame_audio_samples, int audio_bitrate, const char *filename)
       {
           int ret;

           avcodec_register_all();
           av_register_all();

           outctx = avformat_alloc_context();

           char* with_dot = concat(filename, ".");
           char* full_filename = concat(with_dot, compressed_cont);

           ret = avformat_alloc_output_context2(&amp;outctx, NULL, compressed_cont, full_filename);

           free(with_dot);

           if (ret &lt; 0)
           {
               free(full_filename);
               return ERROR_CONTEXT_CREATION;
           }

           ret = setup_audio_codec();
           if (ret &lt; 0)
               return ret;

           // Setup Audio
           ret = initialize_audio_stream(outctx, sample_rate, per_frame_audio_samples, audio_bitrate);
           if (ret &lt; 0)
               return ret;

           av_dump_format(outctx, 0, full_filename, 1);

           if (!(outctx->oformat->flags &amp; AVFMT_NOFILE))
           {
               if (avio_open(&amp;outctx->pb, full_filename, AVIO_FLAG_WRITE) &lt; 0)
               {
                   free(full_filename);
                   return ERROR_OPENING_FILE;
               }
           }

           free(full_filename);

           ret = avformat_write_header(outctx, NULL);
           if (ret &lt; 0)
               return ERROR_WRITING_HEADER;

           return 0;
       }

       int write_interleaved_audio_frame(float_t *aud_sample)
       {
           int ret;

           aud_frame->data[0] = (uint8_t*)aud_sample;
           aud_frame->extended_data[0] = (uint8_t*)aud_sample;

           aud_frame->pts = aud_frame_counter++;

           ret = avcodec_send_frame(aud_codec_context, aud_frame);

           AVPacket pkt;
           av_init_packet(&amp;pkt);
           pkt.data = NULL;
           pkt.size = 0;

           while (true)
           {
               ret = avcodec_receive_packet(aud_codec_context, &amp;pkt);
               if (!ret)
               {
                   av_packet_rescale_ts(&amp;pkt, aud_codec_context->time_base, audio_st->time_base);

                   pkt.stream_index = audio_st->index;

                   av_interleaved_write_frame(outctx, &amp;pkt);

                   av_packet_unref(&amp;pkt);
               }
               if (ret == AVERROR(EAGAIN))
                   break;
               else if (ret &lt; 0)
                   return ERROR_ENCODING_SAMPLES_RECEIVE;
               else
                   break;
           }

           return ENCODED_AUDIO;
       }

       int write_audio_frame(float_t *aud_sample)
       {
           int ret;
           aud_frame->data[0] = (uint8_t*)aud_sample;
           aud_frame->extended_data[0] = (uint8_t*)aud_sample;

           aud_frame->pts = aud_frame_counter++;

           ret = avcodec_send_frame(aud_codec_context, aud_frame);
           if (ret &lt; 0)
               return ERROR_ENCODING_FRAME_SEND;

           AVPacket pkt;
           av_init_packet(&amp;pkt);
           pkt.data = NULL;
           pkt.size = 0;

           fflush(stdout);

           while (true)
           {
               ret = avcodec_receive_packet(aud_codec_context, &amp;pkt);
               if (!ret)
                   if (pkt.pts != AV_NOPTS_VALUE)
                       pkt.pts = av_rescale_q(pkt.pts, aud_codec_context->time_base, audio_st->time_base);
               if (pkt.dts != AV_NOPTS_VALUE)
                   pkt.dts = av_rescale_q(pkt.dts, aud_codec_context->time_base, audio_st->time_base);
               {

                   av_write_frame(outctx, &amp;pkt);
                   av_packet_unref(&amp;pkt);
               }
               if (ret == AVERROR(EAGAIN))
                   break;
               else if (ret &lt; 0)
                   return ERROR_ENCODING_FRAME_RECEIVE;
               else
                   break;
           }

           return ENCODED_AUDIO;
       }

       int finish_audio_encoding()
       {
           AVPacket pkt;
           av_init_packet(&amp;pkt);
           pkt.data = NULL;
           pkt.size = 0;

           fflush(stdout);

           int ret = avcodec_send_frame(aud_codec_context, NULL);
           if (ret &lt; 0)
               return ERROR_ENCODING_FRAME_SEND;

           while (true)
           {
               ret = avcodec_receive_packet(aud_codec_context, &amp;pkt);
               if (!ret)
               {
                   if (pkt.pts != AV_NOPTS_VALUE)
                       pkt.pts = av_rescale_q(pkt.pts, aud_codec_context->time_base, audio_st->time_base);
                   if (pkt.dts != AV_NOPTS_VALUE)
                       pkt.dts = av_rescale_q(pkt.dts, aud_codec_context->time_base, audio_st->time_base);

                   av_write_frame(outctx, &amp;pkt);
                   av_packet_unref(&amp;pkt);
               }
               if (ret == -AVERROR(AVERROR_EOF))
                   break;
               else if (ret &lt; 0)
                   return ERROR_ENCODING_FRAME_RECEIVE;
           }

           av_write_trailer(outctx);

           return 0;
       }

       void cleanup()
       {
           if (aud_frame)
           {
               av_frame_free(&amp;aud_frame);
           }
           if (outctx)
           {
               for (int i = 0; i &lt; outctx->nb_streams; i++)
                   av_freep(&amp;outctx->streams[i]);

               avio_close(outctx->pb);
               av_free(outctx);
           }

           if (aud_codec_context)
           {
               avcodec_close(aud_codec_context);
               av_free(aud_codec_context);
           }
       }

       void fill_samples(float_t *dst, int nb_samples, int nb_channels, int sample_rate, float_t *t)
       {
           int i, j;
           float_t tincr = 1.0 / sample_rate;
           const float_t c = 2 * M_PI * 440.0;

           for (i = 0; i &lt; nb_samples; i++) {
               *dst = sin(c * *t);
               for (j = 1; j &lt; nb_channels; j++)
                   dst[j] = dst[0];
               dst += nb_channels;
               *t += tincr;
           }
       }

       int main()
       {
           int sec = 5;
           int frame_rate = 30;
           float t = 0, tincr = 0, tincr2 = 0;

           int src_samples_linesize;
           int src_nb_samples = 960;
           int src_channels = 2;
           int sample_rate = 48000;

           uint8_t **src_data = NULL;

           int ret;

           initialize_audio_only_encoding(48000, src_nb_samples, 192000, "sound_FLT_960");

           ret = av_samples_alloc_array_and_samples(&amp;src_data, &amp;src_samples_linesize, src_channels,
               src_nb_samples, AV_SAMPLE_FMT_FLT, 0);

           for (size_t i = 0; i &lt; frame_rate * sec; i++)
           {
                   fill_samples((float *)src_data[0], src_nb_samples, src_channels, sample_rate, &amp;t);
                   write_interleaved_audio_frame((float *)src_data[0]);
           }

           finish_audio_encoding();

           cleanup();

           return 0;
       }
    }
    </iterator></algorithm>

    And some of the files :

    The webm audio file that does not work (only in VLC) :
    https://drive.google.com/file/d/0B16rIXjPXJCqcU5HVllIYW1iODg/view?usp=sharing

    The ogg audio file that works :
    https://drive.google.com/file/d/0B16rIXjPXJCqMUZhbW0tTDFjT1E/view?usp=sharing

    Video and Audio file that only works in VLC : https://drive.google.com/file/d/0B16rIXjPXJCqX3pEN3B0QVlrekU/view?usp=sharing

    If a play the ogg file in FFPlay it says "aq= 30kb", but if I play the webm audio only file i get "aq= 0kb". So that does not seem right either.

    Any idea ? Thanks in advance !

  • android - ffmpeg output audio contains garbled sound at the end

    31 mai 2017, par Sha

    I’m converting an audio (recorded via android phone with output type MPEG_4 and encoder DEFAULT) to mp3 using ffmpeg like this :

    -y -i /data/user/0/com.whispero.mithoo/files/input.mp3 -codec:a libmp3lame -qscale:a 2 /data/user/0/com.whispero.mithoo/files/output.mp3

    if the input audio is >20 seconds, there’s garbled audio at the end in the converted output file, otherwise if it’s <20 seconds, the output is fine.

    log :

    05-31 15:54:41.760 11922-11922/com.home.myapp E/onStart: onStart
    05-31 15:54:41.788 11922-11922/com.home.myapp E/first visible: 18: 4: total22,last:21
    05-31 15:54:42.046 11922-11922/com.home.myapp E/onProgress: ffmpeg version n3.0.1 Copyright (c) 2000-2016 the FFmpeg developers
    05-31 15:54:42.046 11922-11922/com.home.myapp E/onProgress:   built with gcc 4.8 (GCC)
    05-31 15:54:42.047 11922-11922/com.home.myapp E/onProgress:   configuration: --target-os=linux --cross-prefix=/home/vagrant/SourceCode/ffmpeg-android/toolchain-android/bin/arm-linux-androideabi- --arch=arm --cpu=cortex-a8 --enable-runtime-cpudetect --sysroot=/home/vagrant/SourceCode/ffmpeg-android/toolchain-android/sysroot --enable-pic --enable-libx264 --enable-libass --enable-libfreetype --enable-libfribidi --enable-libmp3lame --enable-fontconfig --enable-pthreads --disable-debug --disable-ffserver --enable-version3 --enable-hardcoded-tables --disable-ffplay --disable-ffprobe --enable-gpl --enable-yasm --disable-doc --disable-shared --enable-static --pkg-config=/home/vagrant/SourceCode/ffmpeg-android/ffmpeg-pkg-config --prefix=/home/vagrant/SourceCode/ffmpeg-android/build/armeabi-v7a --extra-cflags='-I/home/vagrant/SourceCode/ffmpeg-android/toolchain-android/include -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -fno-strict-overflow -fstack-protector-all' --extra-ldflags='-L/home/vagrant/SourceCode/ffmpeg-android/toolchain-android/lib -Wl,-z,relro -Wl,-z,now -pie' --extra-libs='-lpng -lexpat -lm' --extra-cxxflags=
    05-31 15:54:42.047 11922-11922/com.home.myapp E/onProgress:   libavutil      55. 17.103 / 55. 17.103
    05-31 15:54:42.047 11922-11922/com.home.myapp E/onProgress:   libavcodec     57. 24.102 / 57. 24.102
    05-31 15:54:42.047 11922-11922/com.home.myapp E/onProgress:   libavformat    57. 25.100 / 57. 25.100
    05-31 15:54:42.048 11922-11922/com.home.myapp E/onProgress:   libavdevice    57.  0.101 / 57.  0.101
    05-31 15:54:42.048 11922-11922/com.home.myapp E/onProgress:   libavfilter     6. 31.100 /  6. 31.100
    05-31 15:54:42.048 11922-11922/com.home.myapp E/onProgress:   libswscale      4.  0.100 /  4.  0.100
    05-31 15:54:42.048 11922-11922/com.home.myapp E/onProgress:   libswresample   2.  0.101 /  2.  0.101
    05-31 15:54:42.049 11922-11922/com.home.myapp E/onProgress:   libpostproc    54.  0.100 / 54.  0.100
    05-31 15:54:42.053 11922-11922/com.home.myapp E/onProgress: Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/data/user/0/com.home.myapp/files/166_31052017155411.mp3':
    05-31 15:54:42.053 11922-11922/com.home.myapp E/onProgress:   Metadata:
    05-31 15:54:42.053 11922-11922/com.home.myapp E/onProgress:     major_brand     : mp42
    05-31 15:54:42.054 11922-11922/com.home.myapp E/onProgress:     minor_version   : 0
    05-31 15:54:42.054 11922-11922/com.home.myapp E/onProgress:     compatible_brands: isommp42
    05-31 15:54:42.054 11922-11922/com.home.myapp E/onProgress:     creation_time   : 2017-05-31 10:54:41
    05-31 15:54:42.055 11922-11922/com.home.myapp E/onProgress:     com.android.version: 6.0.1
    05-31 15:54:42.055 11922-11922/com.home.myapp E/onProgress:   Duration: 00:00:29.98, start: 0.000000, bitrate: 15 kb/s
    05-31 15:54:42.056 11922-11922/com.home.myapp E/onProgress:     Stream #0:0(eng): Audio: amr_nb (samr / 0x726D6173), 8000 Hz, mono, flt, 12 kb/s (default)
    05-31 15:54:42.057 11922-11922/com.home.myapp E/onProgress:     Metadata:
    05-31 15:54:42.059 11922-11922/com.home.myapp E/onProgress:       creation_time   : 2017-05-31 10:54:41
    05-31 15:54:42.059 11922-11922/com.home.myapp E/onProgress:       handler_name    : SoundHandle
    05-31 15:54:42.089 11922-11922/com.home.myapp E/onProgress: Output #0, mp3, to '/data/user/0/com.home.myapp/files/166_31052017155411.mp3':
    05-31 15:54:42.090 11922-11922/com.home.myapp E/onProgress:   Metadata:
    05-31 15:54:42.090 11922-11922/com.home.myapp E/onProgress:     major_brand     : mp42
    05-31 15:54:42.091 11922-11922/com.home.myapp E/onProgress:     minor_version   : 0
    05-31 15:54:42.092 11922-11922/com.home.myapp E/onProgress:     compatible_brands: isommp42
    05-31 15:54:42.093 11922-11922/com.home.myapp E/onProgress:     com.android.version: 6.0.1
    05-31 15:54:42.095 11922-11922/com.home.myapp E/onProgress:     TSSE            : Lavf57.25.100
    05-31 15:54:42.095 11922-11922/com.home.myapp E/onProgress:     Stream #0:0(eng): Audio: mp3 (libmp3lame), 8000 Hz, mono, fltp (default)
    05-31 15:54:42.096 11922-11922/com.home.myapp E/onProgress:     Metadata:
    05-31 15:54:42.097 11922-11922/com.home.myapp E/onProgress:       creation_time   : 2017-05-31 10:54:41
    05-31 15:54:42.098 11922-11922/com.home.myapp E/onProgress:       handler_name    : SoundHandle
    05-31 15:54:42.098 11922-11922/com.home.myapp E/onProgress:       encoder         : Lavc57.24.102 libmp3lame
    05-31 15:54:42.099 11922-11922/com.home.myapp E/onProgress: Stream mapping:
    05-31 15:54:42.100 11922-11922/com.home.myapp E/onProgress:   Stream #0:0 -> #0:0 (amr_nb (amrnb) -> mp3 (libmp3lame))
    05-31 15:54:42.100 11922-11922/com.home.myapp E/onProgress: Press [q] to stop, [?] for help
    05-31 15:54:42.595 11922-11922/com.home.myapp E/onProgress: size=      18kB time=00:00:05.54 bitrate=  27.0kbits/s speed=11.1x    
    05-31 15:54:43.096 11922-11922/com.home.myapp E/onProgress: size=      43kB time=00:00:13.32 bitrate=  26.6kbits/s speed=13.3x    
    05-31 15:54:43.518 11922-11922/com.home.myapp E/onProgress: [amrnb @ 0xb5bc3400] Corrupt bitstream
    05-31 15:54:43.518 11922-11922/com.home.myapp E/onProgress: Error while decoding stream #0:0: Invalid data found when processing input
    05-31 15:54:43.525 11922-11922/com.home.myapp E/onProgress: Multiple frames in a packet from stream 0
    05-31 15:54:43.525 11922-11922/com.home.myapp E/onProgress: [amrnb @ 0xb5bc3400] Corrupt bitstream
    05-31 15:54:43.538 11922-11922/com.home.myapp E/onProgress: Error while decoding stream #0:0: Invalid data found when processing input
    05-31 15:54:43.540 11922-11922/com.home.myapp E/onProgress: [amrnb @ 0xb5bc3400] Corrupt bitstream
    05-31 15:54:43.540 11922-11922/com.home.myapp E/onProgress: Error while decoding stream #0:0: Invalid data found when processing input
    05-31 15:54:43.541 11922-11922/com.home.myapp E/onProgress: [amrnb @ 0xb5bc3400] Corrupt bitstream
    05-31 15:54:43.541 11922-11922/com.home.myapp E/onProgress: Error while decoding stream #0:0: Invalid data found when processing input
    05-31 15:54:43.542 11922-11922/com.home.myapp E/onProgress: [amrnb @ 0xb5bc3400] Corrupt bitstream
    05-31 15:54:43.543 11922-11922/com.home.myapp E/onProgress: Error while decoding stream #0:0: Invalid data found when processing input
    05-31 15:54:43.543 11922-11922/com.home.myapp E/onProgress: [amrnb @ 0xb5bc3400] dtx mode is not implemented. Update your FFmpeg version to the newest one from Git. If the problem still occurs, it means that your file has a feature which has not been implemented.
    05-31 15:54:43.544 11922-11922/com.home.myapp E/onProgress: [amrnb @ 0xb5bc3400] Note: libopencore_amrnb supports dtx
    05-31 15:54:43.544 11922-11922/com.home.myapp E/onProgress: Error while decoding stream #0:0: Not yet implemented in FFmpeg, patches welcome
    05-31 15:54:43.545 11922-11922/com.home.myapp E/onProgress: [amrnb @ 0xb5bc3400] Corrupt bitstream
    05-31 15:54:43.546 11922-11922/com.home.myapp E/onProgress: Error while decoding stream #0:0: Invalid data found when processing input
    05-31 15:54:43.546 11922-11922/com.home.myapp E/onProgress: [amrnb @ 0xb5bc3400] Corrupt bitstream
    05-31 15:54:43.547 11922-11922/com.home.myapp E/onProgress: Error while decoding stream #0:0: Invalid data found when processing input
    05-31 15:54:43.547 11922-11922/com.home.myapp E/onProgress: [amrnb @ 0xb5bc3400] Corrupt bitstream
    05-31 15:54:43.548 11922-11922/com.home.myapp E/onProgress: Error while decoding stream #0:0: Invalid data found when processing input
    05-31 15:54:43.549 11922-11922/com.home.myapp E/onProgress: [amrnb @ 0xb5bc3400] Corrupt bitstream
    05-31 15:54:43.549 11922-11922/com.home.myapp E/onProgress: Error while decoding stream #0:0: Invalid data found when processing input
    05-31 15:54:43.550 11922-11922/com.home.myapp E/onProgress: [amrnb @ 0xb5bc3400] Corrupt bitstream
    05-31 15:54:43.551 11922-11922/com.home.myapp E/onProgress: Error while decoding stream #0:0: Invalid data found when processing input
    05-31 15:54:43.551 11922-11922/com.home.myapp E/onProgress: [amrnb @ 0xb5bc3400] Corrupt bitstream
    05-31 15:54:43.552 11922-11922/com.home.myapp E/onProgress: Error while decoding stream #0:0: Invalid data found when processing input
    05-31 15:54:43.552 11922-11922/com.home.myapp E/onProgress: [amrnb @ 0xb5bc3400] Corrupt bitstream
    05-31 15:54:43.553 11922-11922/com.home.myapp E/onProgress: Error while decoding stream #0:0: Invalid data found when processing input
    05-31 15:54:43.554 11922-11922/com.home.myapp E/onProgress: [amrnb @ 0xb5bc3400] Corrupt bitstream
    05-31 15:54:43.555 11922-11922/com.home.myapp E/onProgress: Error while decoding stream #0:0: Invalid data found when processing input
    05-31 15:54:43.556 11922-11922/com.home.myapp E/onProgress: [amrnb @ 0xb5bc3400] dtx mode is not implemented. Update your FFmpeg version to the newest one from Git. If the problem still occurs, it means that your file has a feature which has not been implemented.
    05-31 15:54:43.557 11922-11922/com.home.myapp E/onProgress: [amrnb @ 0xb5bc3400] Note: libopencore_amrnb supports dtx
    05-31 15:54:43.558 11922-11922/com.home.myapp E/onProgress: Error while decoding stream #0:0: Not yet implemented in FFmpeg, patches welcome
    05-31 15:54:43.559 11922-11922/com.home.myapp E/onProgress: [amrnb @ 0xb5bc3400] dtx mode is not implemented. Update your FFmpeg version to the newest one from Git. If the problem still occurs, it means that your file has a feature which has not been implemented.
    05-31 15:54:43.560 11922-11922/com.home.myapp E/onProgress: [amrnb @ 0xb5bc3400] Note: libopencore_amrnb supports dtx
    05-31 15:54:43.561 11922-11922/com.home.myapp E/onProgress: Error while decoding stream #0:0: Not yet implemented in FFmpeg, patches welcome
    05-31 15:54:43.562 11922-11922/com.home.myapp E/onProgress: [amrnb @ 0xb5bc3400] Corrupt bitstream
    05-31 15:54:43.563 11922-11922/com.home.myapp E/onProgress: Error while decoding stream #0:0: Invalid data found when processing input
    05-31 15:54:43.563 11922-11922/com.home.myapp E/onProgress: [amrnb @ 0xb5bc3400] Corrupt bitstream
    05-31 15:54:44.519 11922-11922/com.home.myapp E/onProgress: Error while decoding stream #0:0: Not yet implemented in FFmpeg, patches welcome
    05-31 15:54:44.521 11922-11922/com.home.myapp E/onProgress: [amrnb @ 0xb5bc3400] Corrupt bitstream
    05-31 15:54:44.522 11922-11922/com.home.myapp E/onProgress: Error while decoding stream #0:0: Invalid data found when processing input
    05-31 15:54:44.523 11922-11922/com.home.myapp E/onProgress: [amrnb @ 0xb5bc3400] Corrupt bitstream
    05-31 15:54:44.524 11922-11922/com.home.myapp E/onProgress: Error while decoding stream #0:0: Invalid data found when processing input
    05-31 15:54:44.526 11922-11922/com.home.myapp E/onProgress: [amrnb @ 0xb5bc3400] Corrupt bitstream
    05-31 15:54:44.527 11922-11922/com.home.myapp E/onProgress: Error while decoding stream #0:0: Invalid data found when processing input
    05-31 15:54:44.530 11922-11922/com.home.myapp E/onProgress: [amrnb @ 0xb5bc3400] Corrupt bitstream
    05-31 15:54:44.531 11922-11922/com.home.myapp E/onProgress: Error while decoding stream #0:0: Invalid data found when processing input
    05-31 15:54:44.532 11922-11922/com.home.myapp E/onProgress: [amrnb @ 0xb5bc3400] Corrupt bitstream
    05-31 15:54:44.533 11922-11922/com.home.myapp E/onProgress: Error while decoding stream #0:0: Invalid data found when processing input
    05-31 15:54:44.534 11922-11922/com.home.myapp E/onProgress: [amrnb @ 0xb5bc3400] Corrupt bitstream
    05-31 15:54:44.535 11922-11922/com.home.myapp E/onProgress: Error while decoding stream #0:0: Invalid data found when processing input
    05-31 15:54:44.536 11922-11922/com.home.myapp E/onProgress: [amrnb @ 0xb5bc3400] Corrupt bitstream
    05-31 15:54:44.537 11922-11922/com.home.myapp E/onProgress: Error while decoding stream #0:0: Invalid data found when processing input
    05-31 15:54:44.538 11922-11922/com.home.myapp E/onProgress: [amrnb @ 0xb5bc3400] Corrupt bitstream
    05-31 15:54:44.539 11922-11922/com.home.myapp E/onProgress: Error while decoding stream #0:0: Invalid data found when processing input
    05-31 15:54:44.540 11922-11922/com.home.myapp E/onProgress: [amrnb @ 0xb5bc3400] Corrupt bitstream
    05-31 15:54:44.541 11922-11922/com.home.myapp E/onProgress: Error while decoding stream #0:0: Invalid data found when processing input
    05-31 15:54:44.542 11922-11922/com.home.myapp E/onProgress: [amrnb @ 0xb5bc3400] Corrupt bitstream
    05-31 15:54:44.543 11922-11922/com.home.myapp E/onProgress: Error while decoding stream #0:0: Invalid data found when processing input
    05-31 15:54:44.544 11922-11922/com.home.myapp E/onProgress: [amrnb @ 0xb5bc3400] Corrupt bitstream
    05-31 15:54:44.545 11922-11922/com.home.myapp E/onProgress: Error while decoding stream #0:0: Invalid data found when processing input
    05-31 15:54:44.546 11922-11922/com.home.myapp E/onProgress: [amrnb @ 0xb5bc3400] Corrupt bitstream
    05-31 15:54:44.548 11922-11922/com.home.myapp E/onProgress: Error while decoding stream #0:0: Invalid data found when processing input
    05-31 15:54:44.549 11922-11922/com.home.myapp E/onProgress: size=      90kB time=00:00:30.03 bitrate=  24.6kbits/s speed=16.6x    
    05-31 15:54:44.556 11922-11922/com.home.myapp E/onProgress: video:0kB audio:90kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.425926%
    05-31 15:54:44.558 11922-11922/com.home.myapp E/SUCCESS: SUCCESS
    05-31 15:54:44.558 11922-11922/com.home.myapp E/onFinish: onFinish

    My MediaRecorder settings are :

    mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
    mRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
    mRecorder.setAudioSamplingRate(24000);
    mRecorder.setAudioEncodingBitRate(32000);
    Log.e("Path","Createdfilepath:"+mFile.getPath());
    mRecorder.setOutputFile(mFile.getPath());
    mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);