
Recherche avancée
Médias (1)
-
Bug de détection d’ogg
22 mars 2013, par
Mis à jour : Avril 2013
Langue : français
Type : Video
Autres articles (49)
-
HTML5 audio and video support
13 avril 2011, parMediaSPIP 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, parThe 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, parThe 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 MockarutanI’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 < 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 < 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(&outctx, NULL, compressed_cont, full_filename);
free(with_dot);
if (ret < 0)
{
free(full_filename);
return ERROR_CONTEXT_CREATION;
}
ret = setup_audio_codec();
if (ret < 0)
return ret;
// Setup Audio
ret = initialize_audio_stream(outctx, sample_rate, per_frame_audio_samples, audio_bitrate);
if (ret < 0)
return ret;
av_dump_format(outctx, 0, full_filename, 1);
if (!(outctx->oformat->flags & AVFMT_NOFILE))
{
if (avio_open(&outctx->pb, full_filename, AVIO_FLAG_WRITE) < 0)
{
free(full_filename);
return ERROR_OPENING_FILE;
}
}
free(full_filename);
ret = avformat_write_header(outctx, NULL);
if (ret < 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(&pkt);
pkt.data = NULL;
pkt.size = 0;
while (true)
{
ret = avcodec_receive_packet(aud_codec_context, &pkt);
if (!ret)
{
av_packet_rescale_ts(&pkt, aud_codec_context->time_base, audio_st->time_base);
pkt.stream_index = audio_st->index;
av_interleaved_write_frame(outctx, &pkt);
av_packet_unref(&pkt);
}
if (ret == AVERROR(EAGAIN))
break;
else if (ret < 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 < 0)
return ERROR_ENCODING_FRAME_SEND;
AVPacket pkt;
av_init_packet(&pkt);
pkt.data = NULL;
pkt.size = 0;
fflush(stdout);
while (true)
{
ret = avcodec_receive_packet(aud_codec_context, &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, &pkt);
av_packet_unref(&pkt);
}
if (ret == AVERROR(EAGAIN))
break;
else if (ret < 0)
return ERROR_ENCODING_FRAME_RECEIVE;
else
break;
}
return ENCODED_AUDIO;
}
int finish_audio_encoding()
{
AVPacket pkt;
av_init_packet(&pkt);
pkt.data = NULL;
pkt.size = 0;
fflush(stdout);
int ret = avcodec_send_frame(aud_codec_context, NULL);
if (ret < 0)
return ERROR_ENCODING_FRAME_SEND;
while (true)
{
ret = avcodec_receive_packet(aud_codec_context, &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, &pkt);
av_packet_unref(&pkt);
}
if (ret == -AVERROR(AVERROR_EOF))
break;
else if (ret < 0)
return ERROR_ENCODING_FRAME_RECEIVE;
}
av_write_trailer(outctx);
return 0;
}
void cleanup()
{
if (aud_frame)
{
av_frame_free(&aud_frame);
}
if (outctx)
{
for (int i = 0; i < outctx->nb_streams; i++)
av_freep(&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 < nb_samples; i++) {
*dst = sin(c * *t);
for (j = 1; j < 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(&src_data, &src_samples_linesize, src_channels,
src_nb_samples, AV_SAMPLE_FMT_FLT, 0);
for (size_t i = 0; i < frame_rate * sec; i++)
{
fill_samples((float *)src_data[0], src_nb_samples, src_channels, sample_rate, &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=sharingThe ogg audio file that works :
https://drive.google.com/file/d/0B16rIXjPXJCqMUZhbW0tTDFjT1E/view?usp=sharingVideo 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 MockarutanI’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 < 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 < 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(&outctx, NULL, compressed_cont, full_filename);
free(with_dot);
if (ret < 0)
{
free(full_filename);
return ERROR_CONTEXT_CREATION;
}
ret = setup_audio_codec();
if (ret < 0)
return ret;
// Setup Audio
ret = initialize_audio_stream(outctx, sample_rate, per_frame_audio_samples, audio_bitrate);
if (ret < 0)
return ret;
av_dump_format(outctx, 0, full_filename, 1);
if (!(outctx->oformat->flags & AVFMT_NOFILE))
{
if (avio_open(&outctx->pb, full_filename, AVIO_FLAG_WRITE) < 0)
{
free(full_filename);
return ERROR_OPENING_FILE;
}
}
free(full_filename);
ret = avformat_write_header(outctx, NULL);
if (ret < 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(&pkt);
pkt.data = NULL;
pkt.size = 0;
while (true)
{
ret = avcodec_receive_packet(aud_codec_context, &pkt);
if (!ret)
{
av_packet_rescale_ts(&pkt, aud_codec_context->time_base, audio_st->time_base);
pkt.stream_index = audio_st->index;
av_interleaved_write_frame(outctx, &pkt);
av_packet_unref(&pkt);
}
if (ret == AVERROR(EAGAIN))
break;
else if (ret < 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 < 0)
return ERROR_ENCODING_FRAME_SEND;
AVPacket pkt;
av_init_packet(&pkt);
pkt.data = NULL;
pkt.size = 0;
fflush(stdout);
while (true)
{
ret = avcodec_receive_packet(aud_codec_context, &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, &pkt);
av_packet_unref(&pkt);
}
if (ret == AVERROR(EAGAIN))
break;
else if (ret < 0)
return ERROR_ENCODING_FRAME_RECEIVE;
else
break;
}
return ENCODED_AUDIO;
}
int finish_audio_encoding()
{
AVPacket pkt;
av_init_packet(&pkt);
pkt.data = NULL;
pkt.size = 0;
fflush(stdout);
int ret = avcodec_send_frame(aud_codec_context, NULL);
if (ret < 0)
return ERROR_ENCODING_FRAME_SEND;
while (true)
{
ret = avcodec_receive_packet(aud_codec_context, &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, &pkt);
av_packet_unref(&pkt);
}
if (ret == -AVERROR(AVERROR_EOF))
break;
else if (ret < 0)
return ERROR_ENCODING_FRAME_RECEIVE;
}
av_write_trailer(outctx);
return 0;
}
void cleanup()
{
if (aud_frame)
{
av_frame_free(&aud_frame);
}
if (outctx)
{
for (int i = 0; i < outctx->nb_streams; i++)
av_freep(&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 < nb_samples; i++) {
*dst = sin(c * *t);
for (j = 1; j < 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(&src_data, &src_samples_linesize, src_channels,
src_nb_samples, AV_SAMPLE_FMT_FLT, 0);
for (size_t i = 0; i < frame_rate * sec; i++)
{
fill_samples((float *)src_data[0], src_nb_samples, src_channels, sample_rate, &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=sharingThe ogg audio file that works :
https://drive.google.com/file/d/0B16rIXjPXJCqMUZhbW0tTDFjT1E/view?usp=sharingVideo 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 ShaI’m converting an audio (recorded via android phone with output type
MPEG_4
and encoderDEFAULT
) tomp3
usingffmpeg
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: onFinishMy 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);