Hi Yeah, it makes sense that there is a way to do it with libavformat, but as I mentioned before, wav output wasn't my goal, and I just wanted quick verification that the decoded audio was what I was expecting, so I just wrote out the header manually.
Glad it got you in the right direction though. Andrew On Sun, Mar 14, 2010 at 12:09 PM, Yusuke Kenta <[email protected]> wrote: > Hi Andrew, > > Thank you for the code, had a look through and I understand it now. I used > the avformat_write_header, frame and trailer from libavformat to do it for > me and now I have wav file outputted. > > On Sun, Mar 14, 2010 at 3:54 AM, Andrew Hakman <[email protected]>wrote: > >> It's attached. Guess I never did change the main file yet (I was >> writing some of the threads in separate files, but I thought I had >> changed the main file as well - guess I didn't yet). >> >> Should do exactly what you want. >> >> Follow the wave header info on the link I provided previously to >> figure out what's happening with writing the header, and right at the >> end where I go back and fill in the length fields. >> >> Andrew >> >> On Sat, Mar 13, 2010 at 3:54 PM, Yusuke Kenta <[email protected]> wrote: >> > Hi Andrew, >> > >> > Thank you for the reply. Now I understand why I am getting wav files but >> has >> > no information about it. It will be great if you can send some bits of >> the >> > code to help me understand how to write the header. >> > >> > Regards, >> > >> > Yusuke Kenta >> > >> > On Sat, Mar 13, 2010 at 10:11 PM, Andrew Hakman <[email protected] >> >wrote: >> > >> >> Don't re-encode to "wav", just write out the header yourself, and dump >> >> out the samples you get from decode_audio_3. >> >> For a good explanation of the header specifics, see >> >> https://ccrma.stanford.edu/courses/422/projects/WaveFormat/ >> >> >> >> I had code that did just that a couple weeks ago, but it's in a >> >> non-functional state right now as I'm breaking it into multiple >> >> threads (and writing wav files wasn't the end goal, just an >> >> intermediate step to see that things are working to that point). >> >> Haven't had much time to work on that program recently, but I could >> >> probably extract some bits of it and send it to you if you thought it >> >> would help. >> >> >> >> Andrew >> >> >> >> On Sat, Mar 13, 2010 at 9:09 AM, Edward Hau <[email protected]> wrote: >> >> > Hi, >> >> > >> >> > I am using Martin Böhme example from: >> >> > http://www.inb.uni-luebeck.de/~boehme/using_libavcodec.html<http://www.inb.uni-luebeck.de/%7Eboehme/using_libavcodec.html> >> <http://www.inb.uni-luebeck.de/%7Eboehme/using_libavcodec.html>to open the >> >> > video file and read it then implement libavcodec codec to get audio >> >> stream. >> >> > >> >> > I have several attempts so far but no luck and keeping errors due to >> my >> >> lack >> >> > of understand how to process and save audio as wav (using defaults >> from >> >> > libavcodec) from video. >> >> > >> >> > I am using Microsoft Visual studio 2008 and here the coding so far: >> >> > >> >> > #include <libavcodec\avcodec.h> >> >> > #include <libavformat\avformat.h> >> >> > >> >> > #define INBUF_SIZE 4096 >> >> > >> >> > int main(int argc, char *argv[]) { >> >> > FILE *outputFile; >> >> > unsigned int i, audioStream; >> >> > int frame_size, out_size, enout_size, enoutbuf_size, >> >> len; >> >> > short *samples; >> >> > AVCodecContext *pCodecCtx, *audioEn; >> >> > AVCodec *pCodec, *aCodec; >> >> > AVFormatContext *pFormatCtx; >> >> > CHAR filename[1027]; >> >> > uint8_t *outbuf, *enoutbuf; >> >> > AVPacket packet; >> >> > >> >> > av_register_all(); >> >> > >> >> > if(av_open_input_file(&pFormatCtx, filename, NULL, 0, NULL)!=0) return >> >> -1; >> >> > if(av_find_stream_info(pFormatCtx)<0)return -1; >> >> > dump_format(pFormatCtx, 0, filename, false); >> >> > >> >> > //Find audio stream >> >> > for(i=0; i < pFormatCtx->nb_streams; i++){ >> >> > if(pFormatCtx->streams[i]->codec->codec_type==CODEC_TYPE_AUDIO) >> >> > { >> >> > audioStream=i; >> >> > break; >> >> > } >> >> > } >> >> > >> >> > pCodecCtx=pFormatCtx->streams[audioStream]->codec; >> >> > >> >> > // Find the decoder for the audio stream >> >> > pCodec=avcodec_find_decoder(pCodecCtx->codec_id); >> >> > if(pCodec==NULL){ >> >> > fprintf(stderr, "Cannot find decoder"); >> >> > return -1; // Codec not found >> >> > } >> >> > >> >> > if(avcodec_open(pCodecCtx,pCodec)<0) return -1; >> >> > >> >> > outbuf = (uint8_t*)malloc(AVCODEC_MAX_AUDIO_FRAME_SIZE); >> >> > >> >> > aCodec=avcodec_find_encoder(CODEC_ID_PCM_S16LE); >> >> > if(pCodec==NULL){ >> >> > fprintf(stderr, "Cannot find decoder"); >> >> > return -1; // Codec not found >> >> > } >> >> > >> >> > //setting up encoder >> >> > audioEn = avcodec_alloc_context(); >> >> > audioEn->bit_rate = 1411000; >> >> > audioEn->sample_rate = 44100; >> >> > audioEn->channels = 2; >> >> > audioEn->sample_fmt = SAMPLE_FMT_S16; >> >> > >> >> > if(avcodec_open(audioEn,aCodec)<0){ >> >> > fprintf(stderr, "Could not open encoder codec"); >> >> > std::cin.get(); >> >> > } >> >> > >> >> > frame_size = audioEn->frame_size; >> >> > samples = (short*)malloc(frame_size * 2 * audioEn->channels); >> >> > enoutbuf_size = 10000; >> >> > enoutbuf = (uint8_t*)malloc(enoutbuf_size); >> >> > >> >> > outputFile = fopen(".\\temp1.wav", "wb"); >> >> > if (!outputFile) { >> >> > fprintf(stderr, "could not open %s\n", outputFile); >> >> > std::cin.get(); >> >> > exit(1); >> >> > } >> >> > >> >> > while(av_read_frame(pFormatCtx, &packet)>=0){ >> >> > if(packet.stream_index==audioStream){ >> >> > for(;;){ >> >> > if (packet.size == 0) >> >> > break; >> >> > >> >> > while(packet.size >0){ >> >> > out_size = AVCODEC_MAX_AUDIO_FRAME_SIZE; >> >> > // Decode audio frame >> >> > len = avcodec_decode_audio3(pCodecCtx, (short >> >> *)outbuf, >> >> > &out_size, &packet); >> >> > if (len < 0) { >> >> > fprintf(stderr, "Error while decoding\n"); >> >> > exit(1); >> >> > } >> >> > if (out_size > 0) { >> >> > enout_size=avcodec_encode_audio(audioEn, >> enoutbuf, >> >> > enoutbuf_size, samples); >> >> > fwrite(enoutbuf, 1, enout_size, outputFile); >> >> > } >> >> > packet.size -= len; >> >> > packet.data += len; >> >> > } >> >> > } >> >> > av_free_packet(&packet); >> >> > } >> >> > } >> >> > fclose(outputFile); >> >> > free(outbuf); >> >> > >> >> > // Close the codec >> >> > avcodec_close(pCodecCtx); >> >> > >> >> > // Close the video file >> >> > av_close_input_file(pFormatCtx); >> >> > } >> >> > >> >> > Regards, >> >> > >> >> > Yusuke Kenta >> >> > _______________________________________________ >> >> > libav-user mailing list >> >> > [email protected] >> >> > https://lists.mplayerhq.hu/mailman/listinfo/libav-user >> >> > >> >> _______________________________________________ >> >> libav-user mailing list >> >> [email protected] >> >> https://lists.mplayerhq.hu/mailman/listinfo/libav-user >> >> >> > _______________________________________________ >> > libav-user mailing list >> > [email protected] >> > https://lists.mplayerhq.hu/mailman/listinfo/libav-user >> > >> >> _______________________________________________ >> libav-user mailing list >> [email protected] >> https://lists.mplayerhq.hu/mailman/listinfo/libav-user >> >> > _______________________________________________ > libav-user mailing list > [email protected] > https://lists.mplayerhq.hu/mailman/listinfo/libav-user > _______________________________________________ libav-user mailing list [email protected] https://lists.mplayerhq.hu/mailman/listinfo/libav-user
