Hello,

I'm fairly new to libav and looking forward to some advice.
Here is my problem: I'm encoding a video source (webcam, large file) and for 
direct processing I want the output to be segmented mp4 files.
Instead of writing the segments to file on the hard disk, I was looking for 
outputting the data into a temp buffer via a custom AvioContext.

This works great when encoding single mp4 files, here is how I do it.
Custom write/seek function:

int WriteFunc(void* opaque, uint8_t* buf, int buf_size) {

    std::vector<uint8_t>* tempBuffer = 
static_cast<std::vector<uint8_t>*>(opaque);
    // write buf into tempBuffer
    tempBuffer->insert(tempBuffer->end(), buf, buf + buf_size);
    std::cout << "There are " << tempBuffer->size() << " Bytes in tempBuffer" 
<< std::endl;
    return buf_size;
}

int64_t SeekFunc(void* opaque, int64_t offset, int whence) {

    std::vector<uint8_t>* outputBuffer = 
static_cast<std::vector<uint8_t>*>(opaque);
    int64_t newPosition = 0;

    if (whence == SEEK_SET) {
        newPosition = offset;
    }
    else if (whence == SEEK_CUR) {
        newPosition = outputBuffer->size() + offset;
    }
    else if (whence == SEEK_END) {
        newPosition = outputBuffer->size() - offset;
    }
    if (newPosition < 0 || newPosition > outputBuffer->size()) {
        return -1;
    }
    return newPosition;
}

Creating avio Context:
const int ioBufferSize = 32768;
    unsigned char* ioBuffer = (unsigned char*)av_malloc(ioBufferSize + 
AV_INPUT_BUFFER_PADDING_SIZE)
    AVIOContext* avio_out = avio_alloc_context(ioBuffer, ioBufferSize, 1, 
&tempBuffer, 0, WriteFunc, SeekFunc);

When I run my code with the following output_context,
avformat_alloc_output_context2(&encoder->avfc, NULL, "mp4", encoder->filename);
I can see my tempBuffer filling up. Writing the contents of tempBuffer after 
encoding results in a playable mp4, so my context is working.

This doesnt work at all when using 'segment' muxer. My callback functions arent 
even called and the segments are written
locally based on encoder->filename to file.
Anyone got experience with that problem?
Another solution I tried to implement was using fragmented mp4 and trying to 
manually segment the content of my tempBuffer, but without sucess.
Would love some hints or tips, it's clear that I'm lacking the knowledge of the 
underlying libav processes to create a solution.

Thanks in advance
_______________________________________________
Libav-user mailing list
Libav-user@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/libav-user

To unsubscribe, visit link above, or email
libav-user-requ...@ffmpeg.org with subject "unsubscribe".

Reply via email to