Hello team! 

I would appreciate your help on the following issue.

Background of the issue:

I am doing live mp3 to aac transcoding with adts muxing. I am using C functions 
from libraries inside FFMPEG (libavcodec, libavformat, etc.) through CGO (a 
tool that allows call C code within Golang).

Scenario is as follows:
1. Open mp3 input
2. Open output format:

{{{
        adts := C.CString("adts")
        defer C.free(unsafe.Pointer(adts))
        var ctx *C.AVFormatContext
        if ret := C.avformat_alloc_output_context2(&ctx, nil,  adts, nil); ret 
< 0 {
                return
        }
}}}
3. Write header with several options that I need for appropriate metadata 
(according to: https://datatracker.ietf.org/doc/html/rfc8216#section-3.4), 
options taken from here - https://ffmpeg.org/ffmpeg-formats.html#adts-1:


{{{
C.av_dict_set(&f.opts.dict, "write_id3v2","1", 0)
C.av_dict_set(&f.opts.dict, "write_apetag","1", 0)
C.av_dict_set(&outAVFormatCtx.metadata, "TIPL", "Awesome production", 0)
C.avformat_write_header(&outAVFormatCtx, &f.opts.dict)
}}}

4. demuxing and decoding input stream and encoding frames and muxing to output 
stream. I will not provide too much details here as this part works pretty 
fine. 

5. Accumulating output stream of certain duration (10 seconds e.g.) and writing 
`.aac` segment to a storage. (Ideally this part works forever in order to 
produce HLS stream out of these segments later)

6. When receiving a first frame for the following segment I try to write its 
PTS (start time of the next segment) to the metadata tag:


{{{
C.av_dict_set(&outAVFormatCtx.metadata, 
"PRIV.com.apple.streaming.transportStreamTimestamp", <some random int64 value 
encoded to bytes>, 0)
outAVFormatCtx.event_flags |= C.avfmt_event_flag_metadata_updated
}}}

However I don't see any metadata when ffprobing my segments:

    "format": {
        "filename": "filename.aac",
        "nb_streams": 1,
        "nb_programs": 0,
        "format_name": "aac",
        "format_long_name": "raw ADTS AAC (Advanced Audio Coding)",
        "duration": "10.011431",
        "size": "26458",
        "bit_rate": "38253",
        "probe_score": 51
    }

However when I do something very similar with ffmpeg command as follows:

ffmpeg -i input.mp3 -vn -acodec copy -f adts -metadata title="Foo" -metadata 
PRIV.com.apple.streaming.transportStreamTimestam="1111111" -write_id3v2 1 
-write_apetag 1 output.aac

I get what I want:

        "filename": "output.aac",
        "nb_streams": 1,
        "nb_programs": 0,
        "format_name": "aac",
        "format_long_name": "raw ADTS AAC (Advanced Audio Coding)",
        "duration": "5.485686",
        "size": "33278",
        "bit_rate": "48530",
        "probe_score": 51,
        "tags": {
            "TIT2": "Foo",
            "PRIV.com.apple.streaming.transportStreamTimestam": "1111111",
            "TSSE": "Lavf59.27.100"
        }


So my question is how to write ID3v2 metadata to adts container through 
libavformat? Since this is quite a requirement of RFC-8216 
(https://datatracker.ietf.org/doc/html/rfc8216#section-3.4).









 
_______________________________________________
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