On Tue, Jul 27, 2010 at 3:25 AM, Michael Chisholm <[email protected]>wrote:
> On 7/26/2010 4:20 AM, Tomas Härdin wrote: > >> On Mon, 2010-07-26 at 16:32 +0900, Nhat Huy wrote: >> >>> On Mon, Jul 26, 2010 at 3:54 PM, Tomas Härdin<[email protected] >>> >wrote: >>> >>> On Thu, 2010-07-22 at 23:40 +0900, Nhat Huy wrote: >>>> >>>>> On Thu, Jul 22, 2010 at 7:20 PM, Tomas Härdin<[email protected] >>>>> wrote: >>>>> >>>>> On Thu, 2010-07-22 at 18:26 +0900, Nhat Huy wrote: >>>>>> >>>>>>> My input file points to a ES bitstream, that's why I can not pass a >>>>>>> >>>>>> char* >>>> >>>>> file name to av_open_input_file. >>>>>>> >>>>>>> Any helps will appreciated. >>>>>>> Thanks. >>>>>>> >>>>>>> >>>>>>> >>>>>>> On Thu, Jul 22, 2010 at 6:18 PM, Nhat Huy<[email protected]> >>>>>>> >>>>>> wrote: >>>> >>>>> >>>>>>> Hi all, >>>>>>>> >>>>>>>> I have a problem with the function av_open_input_file. >>>>>>>> >>>>>>>> As normal , we can use it like this: >>>>>>>> >>>>>>>> if(av_open_input_file(&pFormatCtx, argv[1], NULL, 0, NULL)!=0) >>>>>>>> return -1; // Couldn't open file >>>>>>>> >>>>>>>> My problem is that I can not pass argv[1] into this function, now I >>>>>>>> >>>>>>> have to >>>>>> >>>>>>> pass a file pointer, which already is opened by fopen in another >>>>>>>> >>>>>>> function. >>>>>> >>>>>>> >>>>>>>> Can anyone help me with this problem ? I stuck with it. >>>>>>>> >>>>>>>> Best regards, >>>>>>>> Huy. >>>>>>>> >>>>>>>> >>>>>>>> >>>>>> Check out how the "pipe" protocol works. Use fileno() to get the file >>>>>> descriptor corresponding to the given FILE*. IIRC you do something >>>>>> like >>>>>> "pipe:<fd>", like "pipe:0" to read from stdin. >>>>>> >>>>>> You could also possibly hack it using named pipes, but I suspect the >>>>>> above method is the easiest. >>>>>> >>>>>> /Tomas >>>>>> >>>>>> _______________________________________________ >>>>>> libav-user mailing list >>>>>> [email protected] >>>>>> https://lists.mplayerhq.hu/mailman/listinfo/libav-user >>>>>> >>>>>> >>>>>> >>>>> Thanks Tomas. >>>>> >>>>> According to your reply. >>>>> Is the following code right ? >>>>> >>>>> FILE* input; >>>>> input = fopen(filename,"rb"); >>>>> fd = fileno(input); >>>>> if(av_open_input_file(&pFormatCtx, "pipe:fd", NULL, 0, NULL)!=0) >>>>> return -1; // Couldn't open file >>>>> >>>>> Thank you very much. >>>>> Huy >>>>> >>>> >>>> Uhm.. You need to use sprintf(), like: >>>> >>>> char temp[32]; >>>> sprintf(temp, "pipe:%i", fd); >>>> if(av_open_input_file(&pFormatCtx, temp, NULL, 0, NULL)!=0) >>>> return -1; // Couldn't open file >>>> >>>> /Tomas >>>> >>>> _______________________________________________ >>>> libav-user mailing list >>>> [email protected] >>>> https://lists.mplayerhq.hu/mailman/listinfo/libav-user >>>> >>>> >>>> >>> Hi Tomas, >>> >>> Now can I pass a bit-stream buffer instead of a file in FFmpeg ? Because >>> my >>> input bit-stream is stored in memory, not in a file. I stuck is this >>> problem. >>> >>> Can I write my program like this? >>> >>> int main{ >>> unsigned char *OutBuf; >>> FILE* input; >>> >>> input = fopen(argv[1], "rb"); >>> fread(bitStream_buffer, 1 ,length ,input); >>> >>> if(av_open_input_file(&pFormatCtx, bitStream_buffer, NULL, 0, NULL)!=0) >>> >>> ........... >>> } >>> >>> Regards, >>> Huy. >>> >> >> No. I'm not sure how to handle that specific case. Are you really >> reading a file to RAM or is that just an example? You need to explain >> your situation more clearly, because in your initial post you said you >> had a FILE pointer, which means you shouldn't need to read into any >> buffer. >> >> Btw, ffmpeg can transcode certain videos from stdin nowadays. Try >> outputing your data stdout then pipe that to ffmpeg with "-" as the >> input file, like "./your_program | ffmpeg -i - output.avi" and see what >> happens. >> >> /Tomas >> > > It's possible to read from memory. I am doing that myself: I get > compressed jpeg images from google protobuf messages and have to transcode > them to a video format. It would be awfully inefficient to write the jpeg > data for each frame out to a file first. > > What we did is create our own protocol. Each one has a name, which you use > as the scheme name for the URL you open. av_open_input_file() will find the > protocol implementation associated with the scheme name (which is what you > write), and use it for I/O. The rest of the URL is up to you; you can put > whatever you want in it (e.g. a pointer to an in-memory buffer....) See > av_register_protocol(), and URLProtocol. > > If enough people need this kind of capability, maybe a memory buffer > "protocol" ought to be built into libav*. > > Andy > > > _______________________________________________ > libav-user mailing list > [email protected] > https://lists.mplayerhq.hu/mailman/listinfo/libav-user > My situation is as same as Andy's. I get H.264 bit-stream via network, then have to decode it to receive YUV data. It's not a wise choice to write bit-stream into hard drive, and then use av_open_input_file() to open this bit-stream. My program must decode H.264 bit-stream, which is stored in memory. Can I use the "pipe" protocol ? Or should I write a memory buffer "protocol" ? It may be difficult for me. Huy. _______________________________________________ libav-user mailing list [email protected] https://lists.mplayerhq.hu/mailman/listinfo/libav-user
