<div dir="auto">I am unable to compile your code, but at first glance you are missing the main loop. The one that would call writeaudiochunk.</div><div class="gmail_extra"><br><div class="gmail_quote">El feb. 20, 2017 12:41 PM, "Prakash Rokade" <<a href="mailto:prakash.rokade420@gmail.com">prakash.rokade420@gmail.com</a>> escribió:<br type="attribution"><blockquote class="quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div><div>Hiii Gonzalo Garramuño,<br><br></div>I have modified the code but there is issue that i am not able to figure out.<br></div>No error while encoding, resampling , and writting the audio data. But output file only have the 1 sec audio. can you check the code and suggest some changes.<br><br>ref struct AudioWriterData<div class="quoted-text"><br> {<br> public:<br> Ffmpeg::AVFormatContext* FormatContext;<br> <br> Ffmpeg::AVStream* AudioStream;<br> Ffmpeg::AVFrame* AudioFrame;<br> Ffmpeg::AVCodec *Audio_Codec;<br><br> int AudioBitRate;<br> int SampleRate;<br> int Channels;<br> <br> int AudioReceived;<br> int AudioWritten;<br><br></div><div class="quoted-text"> int64_t next_pts;<br> int samples_count;<br><br> Ffmpeg::AVFrame *tmp_frame;<br><br> float t, tincr, tincr2;<br> struct Ffmpeg::SwsContext *sws_ctx;<br> struct Ffmpeg::SwrContext *swr_ctx;<br><br> double PreviousAudioDts;<br><br></div> double EncodedAudioFrame;<div class="quoted-text"><br><br> AudioWriterData()<br> {<br> FormatContext = NULL;<br> <br> AudioStream = NULL;<br><br> Audio_Codec = NULL;<br><br> AudioFrame = NULL;<br> <br> AudioReceived = 0;<br> AudioWritten = 0;<br></div> EncodedAudioFrame = 0;<br> }<br> };<br> <br> <br> //Open the audio file with specified settings<br> void AudioWriter::Open(String^ fileName, AudioCodec audioCodec, int audioBitrate, int sampleRate, int channels)<br> {<br> CheckIfDisposed();<br><br> Close();<br><br> data = gcnew AudioWriterData();<div class="quoted-text"><br> bool success = false;<br><br> if (((int)audioCodec < -1) || ((int)audioCodec >= AUDIO_CODECS_COUNT))<br> throw gcnew ArgumentException("Invalid audio codec is specified.");<br><br> m_acodec = audioCodec;<br> m_audioBitrate = audioBitrate;<br> m_sampleRate = sampleRate;<br> m_channels = channels;<br><br> data->AudioBitRate = audioBitrate;<br> data->SampleRate = sampleRate;<br> data->Channels = channels;<br><br> char* nativeFileName = (char*)System::Runtime::<wbr>InteropServices::Marshal::<wbr>StringToHGlobalAnsi(fileName).<wbr>ToPointer();<br><br> try<br> {<br> Ffmpeg::AVOutputFormat* outputFormat = Ffmpeg::av_guess_format(NULL, nativeFileName, NULL);<br><br> if (!outputFormat)<br> {<br> outputFormat = Ffmpeg::av_guess_format("mp3", NULL, NULL);<br><br> if (!outputFormat)<br> throw gcnew Exception("Cannot find suitable output format.");<br> }<br><br> data->FormatContext = Ffmpeg::avformat_alloc_<wbr>context();<br><br> if (!data->FormatContext)<br> throw gcnew Exception("Cannot allocate format context.");<br><br> data->FormatContext->oformat = outputFormat;<br> strcpy_s(data->FormatContext-><wbr>filename, nativeFileName);<br><br></div> Ffmpeg::AVCodecID avcodecid = (audioCodec == AudioCodec::Default) ? outputFormat->audio_codec : (Ffmpeg::AVCodecID) audio_codecs[(int)audioCodec];<br> data->FormatContext->oformat-><wbr>audio_codec = avcodecid;<br><br> add_stream(data, data->FormatContext, data->Audio_Codec, avcodecid);<br><br> open_audio(data-><wbr>FormatContext, data->Audio_Codec, data);<div class="quoted-text"><br><br> Ffmpeg::av_dump_format(data-><wbr>FormatContext, 0, nativeFileName, 1);<br><br> if (!(outputFormat->flags & AVFMT_NOFILE))<br> {<br> if (Ffmpeg::avio_open(&data-><wbr>FormatContext->pb, nativeFileName, AVIO_FLAG_WRITE) < 0)<br></div> throw gcnew System::IO::IOException("<wbr>Cannot open the audio file.");<div class="quoted-text"><br> }<br><br> Ffmpeg::avformat_write_header(<wbr>data->FormatContext, NULL);<br><br> success = true;<br> }<br> finally<br> {<br> nativeFileName = NULL;<br> delete[] nativeFileName;<br><br> if (!success)<br> Close();<br> }<br> }<br> <br></div> static void add_stream(AudioWriterData^ ost, Ffmpeg::AVFormatContext *oc, Ffmpeg::AVCodec *codec, enum Ffmpeg::AVCodecID codec_id)<br> {<br> Ffmpeg::AVCodecContext *c;<br> int i;<br><br> codec = Ffmpeg::avcodec_find_encoder(<wbr>codec_id);<br><br> if (!(codec)) <br> throw gcnew Exception("Invalid audio codec is specified.");<br><br> ost->AudioStream = Ffmpeg::avformat_new_stream(<wbr>oc, codec);<br><br> if (!ost->AudioStream)<br> throw gcnew Exception("Unable to add audio stream.");<br><br> ost->AudioStream->id = oc->nb_streams - 1;<br> c = ost->AudioStream->codec;<br> c->sample_fmt = (codec)->sample_fmts ? (codec)->sample_fmts[0] : Ffmpeg::AV_SAMPLE_FMT_FLTP;<br> c->bit_rate = ost->AudioBitRate;<br> c->sample_rate = 44100;<br> if ((codec)->supported_<wbr>samplerates) <br> {<br> c->sample_rate = (codec)->supported_<wbr>samplerates[0];<br> for (i = 0; (codec)->supported_<wbr>samplerates[i]; i++) <br> {<br> if ((codec)->supported_<wbr>samplerates[i] == 44100)<br> c->sample_rate = 44100;<br> }<br> }<br> c->channels = Ffmpeg::av_get_channel_layout_<wbr>nb_channels(c->channel_layout)<wbr>;<br> c->channel_layout = AV_CH_LAYOUT_STEREO;<br> if ((codec)->channel_layouts) <br> {<br> c->channel_layout = (codec)->channel_layouts[0];<br> for (i = 0; (codec)->channel_layouts[i]; i++) <br> {<br> if ((codec)->channel_layouts[i] == AV_CH_LAYOUT_STEREO)<br> c->channel_layout = AV_CH_LAYOUT_STEREO;<br> }<br> }<br> c->channels = Ffmpeg::av_get_channel_layout_<wbr>nb_channels(c->channel_layout)<wbr>;<br> ost->AudioStream->time_base.<wbr>num = 1;<br> ost->AudioStream->time_base.<wbr>den = c->sample_rate;<br> <br> if (oc->oformat->flags & AVFMT_GLOBALHEADER)<br> c->flags |= AV_CODEC_FLAG_GLOBAL_HEADER;<br> }<br><br> static Ffmpeg::AVFrame *alloc_audio_frame(enum Ffmpeg::AVSampleFormat sample_fmt,uint64_t channel_layout,int sample_rate, int nb_samples)<br> {<br> Ffmpeg::AVFrame *frame = Ffmpeg::av_frame_alloc();<br> int ret;<br> if (!frame) <br> throw gcnew Exception("Unable to allocate frame.");<br> <br> frame->format = sample_fmt;<br> frame->channel_layout = channel_layout;<br> frame->sample_rate = sample_rate;<br> frame->nb_samples = nb_samples;<br> <br> if (nb_samples) <br> {<br> ret = av_frame_get_buffer(frame, 0);<br> if (ret < 0) <br> throw gcnew Exception("Unable to buffer frame.");<br> }<br> <br> return frame;<br> }<br> <br> static void open_audio(Ffmpeg::<wbr>AVFormatContext *oc, Ffmpeg::AVCodec *codec, AudioWriterData^ ost)<br> {<br> Ffmpeg::AVCodecContext *c;<br> int nb_samples;<br> int ret;<br> c = ost->AudioStream->codec;<br><br> ret = avcodec_open2(c, codec, NULL);<div class="quoted-text"><br> if (ret < 0)<br> throw gcnew Exception("Cannot open audio codec.");<br><br></div> ost->t = 0;<br> ost->tincr = 2 * M_PI * 110.0 / c->sample_rate;<br> ost->tincr2 = 2 * M_PI * 110.0 / c->sample_rate / c->sample_rate;<br> <br> if (c->codec->capabilities & AV_CODEC_CAP_VARIABLE_FRAME_<wbr>SIZE)<br> nb_samples = 10000;<br> else<br> nb_samples = c->frame_size;<br> <br> ost->AudioFrame = alloc_audio_frame(c->sample_<wbr>fmt, c->channel_layout, c->sample_rate, nb_samples);<br> ost->tmp_frame = alloc_audio_frame(Ffmpeg::AV_<wbr>SAMPLE_FMT_S16, c->channel_layout, c->sample_rate, nb_samples);<br> <br> ost->swr_ctx = Ffmpeg::swr_alloc();<br> if (!ost->swr_ctx)<br> throw gcnew Exception("Could not allocate resampler context.");<br> <br> Ffmpeg::av_opt_set_int(ost-><wbr>swr_ctx, "in_channel_count", c->channels, 0);<br> Ffmpeg::av_opt_set_int(ost-><wbr>swr_ctx, "in_sample_rate", c->sample_rate, 0);<br> Ffmpeg::av_opt_set_sample_fmt(<wbr>ost->swr_ctx, "in_sample_fmt", Ffmpeg::AV_SAMPLE_FMT_S16, 0);<br> Ffmpeg::av_opt_set_int(ost-><wbr>swr_ctx, "out_channel_count", c->channels, 0);<br> Ffmpeg::av_opt_set_int(ost-><wbr>swr_ctx, "out_sample_rate", c->sample_rate, 0);<br> Ffmpeg::av_opt_set_sample_fmt(<wbr>ost->swr_ctx, "out_sample_fmt", c->sample_fmt, 0);<br> <br> if ((ret = Ffmpeg::swr_init(ost->swr_ctx)<wbr>) < 0)<br> throw gcnew Exception("Failed to initialize the resampling context.");<br> }<br> <br> void AudioWriter::WriteAudioChunk(<wbr>IntPtr chunk, int lenght)<br> {<br> uint8_t *audioData = reinterpret_cast<uint8_t*>(<wbr>static_cast<void*>(chunk));<br><br> int buffer_size = Ffmpeg::av_samples_get_buffer_<wbr>size(NULL, data->tmp_frame->channels, data->tmp_frame->nb_samples,<br> data->AudioStream->codec-><wbr>sample_fmt, 0);<br><br> uint8_t *buf = reinterpret_cast<uint8_t*>(<wbr>static_cast<void*>(chunk));<br> int ret = Ffmpeg::avcodec_fill_audio_<wbr>frame(data->tmp_frame, data->Channels, data->AudioStream->codec-><wbr>sample_fmt, buf, buffer_size, 1);<div class="quoted-text"><br> if (!ret)<br> throw gcnew System::IO::IOException("A video file was not opened yet.");<br><br></div> write_audio_frame(data-><wbr>FormatContext, data, audioData);<br> }<br> <br> static int write_audio_frame(Ffmpeg::<wbr>AVFormatContext *oc, AudioWriterData^ ost, uint8_t *audioData)<br> {<br> Ffmpeg::AVCodecContext *c;<br> Ffmpeg::AVPacket pkt = { 0 };<br> int ret;<br> int got_packet;<br> int dst_nb_samples;<br><br> Ffmpeg::av_init_packet(&pkt);<br> c = ost->AudioStream->codec;<br> <br> Ffmpeg::AVFrame *frame = ost->tmp_frame;<br><br> if (frame)<br> {<br> dst_nb_samples = Ffmpeg::av_rescale_rnd(swr_<wbr>get_delay(ost->swr_ctx, c->sample_rate) + frame->nb_samples,<br> c->sample_rate, c->sample_rate, Ffmpeg::AV_ROUND_UP);<br> if (dst_nb_samples != frame->nb_samples)<br> throw gcnew Exception("dst_nb_samples != frame->nb_samples");<br><br> ret = Ffmpeg::av_frame_make_<wbr>writable(ost->AudioFrame);<br> if (ret < 0)<br> throw gcnew Exception("Unable to make writable.");<br><br> ret = swr_convert(ost->swr_ctx, ost->AudioFrame->data, dst_nb_samples, (const uint8_t **)frame->data, frame->nb_samples);<br> if (ret < 0) <br> throw gcnew Exception("Unable to convert to destination format.");<br> <br> frame = ost->AudioFrame;<br><br> Ffmpeg::AVRational timebase = { 1, c->sample_rate };<br> frame->pts = Ffmpeg::av_rescale_q(ost-><wbr>samples_count, timebase, c->time_base);<br> ost->samples_count += dst_nb_samples;<br> }<br><br> ret = avcodec_encode_audio2(c, &pkt, frame, &got_packet);<br> if (ret < 0) <br> throw gcnew Exception("Error encoding audio frame.");<br><br> if (got_packet) <br> {<br> Console::WriteLine("Audio packet encode successfully.");<br> ret = write_frame(oc, &c->time_base, ost->AudioStream, &pkt);<br> if (ret < 0)<br> Console::WriteLine("Audio is not written.");<br> }<br> else<br> Console::WriteLine("Audio packet encode failed.");<br><br> return (ost->AudioFrame || got_packet) ? 0 : 1;<br> }<br><br> static int write_frame(Ffmpeg::<wbr>AVFormatContext *fmt_ctx, const Ffmpeg::AVRational *time_base, Ffmpeg::AVStream *st, Ffmpeg::AVPacket *pkt)<br> {<br> Ffmpeg::av_packet_rescale_ts(<wbr>pkt, *time_base, st->time_base);<br> pkt->stream_index = st->index;<br> return Ffmpeg::av_interleaved_write_<wbr>frame(fmt_ctx, pkt);<br> }<br></div><div class="gmail_extra"><br><div class="gmail_quote"><div class="elided-text">On 16 February 2017 at 03:13, Gonzalo Garramuño <span dir="ltr"><<a href="mailto:ggarra13@gmail.com" target="_blank">ggarra13@gmail.com</a>></span> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="elided-text">
<div bgcolor="#FFFFFF" text="#000000">
<p><br>
</p>
<br>
<div class="m_-5977202174146604855m_8816357505044468833moz-cite-prefix">El 15/02/17 a las 03:58, Prakash Rokade
escribió:<br>
</div><span>
<blockquote type="cite">
<div dir="ltr">
<div>Thanks Gonzalo,</div>
<div><br>
</div>
<div>According to your suggestion i have written the below code
can you check ones, because audio is written but in output
file no audio is present.</div>
<div><span style="font-size:12.8px"></span><br style="font-size:12.8px">
</div>
</div>
</blockquote></span>
You are opening the stream with AV_SAMPLE_FMT_S16 and then using
sample_fmt[0]. That's inconsistent to say the least.<br>
You are not using swresample to take one audio format to another.<br>
You have a swscale ptr which has nothing to do with audio.<br>
You are using the new API but are not handling the AVERROR(EAGAIN)
cases. For this trial, use the old api which is more reliable for
muxing.<br>
Try to get the sample in doc/examples working and slowly modify it
to fit your need.<span class="m_-5977202174146604855HOEnZb"><font color="#888888"><br>
<pre class="m_-5977202174146604855m_8816357505044468833moz-signature" cols="72">--
Gonzalo Garramuño</pre>
</font></span></div>
<br></div><div class="quoted-text">______________________________<wbr>_________________<br>
Libav-user mailing list<br>
<a href="mailto:Libav-user@ffmpeg.org" target="_blank">Libav-user@ffmpeg.org</a><br>
<a href="http://ffmpeg.org/mailman/listinfo/libav-user" rel="noreferrer" target="_blank">http://ffmpeg.org/mailman/list<wbr>info/libav-user</a><br>
<br></div></blockquote></div><br></div>
<br>______________________________<wbr>_________________<br>
Libav-user mailing list<br>
<a href="mailto:Libav-user@ffmpeg.org">Libav-user@ffmpeg.org</a><br>
<a href="http://ffmpeg.org/mailman/listinfo/libav-user" rel="noreferrer" target="_blank">http://ffmpeg.org/mailman/<wbr>listinfo/libav-user</a><br>
<br></blockquote></div><br></div>