美文网首页
MediaMuxer 保存文件的4G限制

MediaMuxer 保存文件的4G限制

作者: 技术笔记 | 来源:发表于2019-10-28 14:53 被阅读0次

    MediaMuxer没有可以设置参数的地方,看了下MediaRecoder里面可以通过setParameter来设置param-use-64bit-offset。

    对应的设置参数的代码在StagefrightRecorder.cpp文件里面:
    frameworks/av/media/libmediaplayerservice/StagefrightRecorder.cpp

        } else if (key == "param-use-64bit-offset") {
            int32_t use64BitOffset;
            if (safe_strtoi32(value.string(), &use64BitOffset)) {
                return setParam64BitFileOffset(use64BitOffset != 0);
            }
        }
    

    setParam64BitFileOffset函数修改的是mUse64BitFileOffset(kKey64BitFileOffset),

    status_t StagefrightRecorder::setParam64BitFileOffset(bool use64Bit) {
        ALOGV("setParam64BitFileOffset: %s",
            use64Bit? "use 64 bit file offset": "use 32 bit file offset");
        mUse64BitFileOffset = use64Bit;
        return OK;
    }
    

    对应的frameworks/av/include/media/stagefright/MetaDataBase.h

    // Set this key to enable authoring files in 64-bit offset
    kKey64BitFileOffset   = 'fobt',  // int32_t (bool)
    

    stagefrightRecoder里面可配置的参数有如下之多:

    status_t StagefrightRecorder::setParameter(
            const String8 &key, const String8 &value) {
        ALOGV("setParameter: key (%s) => value (%s)", key.string(), value.string());
        if (key == "max-duration") {
            int64_t max_duration_ms;
            if (safe_strtoi64(value.string(), &max_duration_ms)) {
                return setParamMaxFileDurationUs(1000LL * max_duration_ms);
            }
        } else if (key == "max-filesize") {
            int64_t max_filesize_bytes;
            if (safe_strtoi64(value.string(), &max_filesize_bytes)) {
                return setParamMaxFileSizeBytes(max_filesize_bytes);
            }
        } else if (key == "interleave-duration-us") {
            int32_t durationUs;
            if (safe_strtoi32(value.string(), &durationUs)) {
                return setParamInterleaveDuration(durationUs);
            }
        } else if (key == "param-movie-time-scale") {
            int32_t timeScale;
            if (safe_strtoi32(value.string(), &timeScale)) {
                return setParamMovieTimeScale(timeScale);
            }
        } else if (key == "param-use-64bit-offset") {
            int32_t use64BitOffset;
            if (safe_strtoi32(value.string(), &use64BitOffset)) {
                return setParam64BitFileOffset(use64BitOffset != 0);
            }
        } else if (key == "param-geotag-longitude") {
            int64_t longitudex10000;
            if (safe_strtoi64(value.string(), &longitudex10000)) {
                return setParamGeoDataLongitude(longitudex10000);
            }
        } else if (key == "param-geotag-latitude") {
            int64_t latitudex10000;
            if (safe_strtoi64(value.string(), &latitudex10000)) {
                return setParamGeoDataLatitude(latitudex10000);
            }
        } else if (key == "param-track-time-status") {
            int64_t timeDurationUs;
            if (safe_strtoi64(value.string(), &timeDurationUs)) {
                return setParamTrackTimeStatus(timeDurationUs);
            }
        } else if (key == "audio-param-sampling-rate") {
            int32_t sampling_rate;
            if (safe_strtoi32(value.string(), &sampling_rate)) {
                return setParamAudioSamplingRate(sampling_rate);
            }
        } else if (key == "audio-param-number-of-channels") {
            int32_t number_of_channels;
            if (safe_strtoi32(value.string(), &number_of_channels)) {
                return setParamAudioNumberOfChannels(number_of_channels);
            }
        } else if (key == "audio-param-encoding-bitrate") {
            int32_t audio_bitrate;
            if (safe_strtoi32(value.string(), &audio_bitrate)) {
                return setParamAudioEncodingBitRate(audio_bitrate);
            }
        } else if (key == "audio-param-time-scale") {
            int32_t timeScale;
            if (safe_strtoi32(value.string(), &timeScale)) {
                return setParamAudioTimeScale(timeScale);
            }
        } else if (key == "video-param-encoding-bitrate") {
            int32_t video_bitrate;
            if (safe_strtoi32(value.string(), &video_bitrate)) {
                return setParamVideoEncodingBitRate(video_bitrate);
            }
        } else if (key == "video-param-rotation-angle-degrees") {
            int32_t degrees;
            if (safe_strtoi32(value.string(), &degrees)) {
                return setParamVideoRotation(degrees);
            }
        } else if (key == "video-param-i-frames-interval") {
            int32_t seconds;
            if (safe_strtoi32(value.string(), &seconds)) {
                return setParamVideoIFramesInterval(seconds);
            }
        } else if (key == "video-param-encoder-profile") {
            int32_t profile;
            if (safe_strtoi32(value.string(), &profile)) {
                return setParamVideoEncoderProfile(profile);
            }
        } else if (key == "video-param-encoder-level") {
            int32_t level;
            if (safe_strtoi32(value.string(), &level)) {
                return setParamVideoEncoderLevel(level);
            }
        } else if (key == "video-param-camera-id") {
            int32_t cameraId;
            if (safe_strtoi32(value.string(), &cameraId)) {
                return setParamVideoCameraId(cameraId);
            }
        } else if (key == "video-param-time-scale") {
            int32_t timeScale;
            if (safe_strtoi32(value.string(), &timeScale)) {
                return setParamVideoTimeScale(timeScale);
            }
        } else if (key == "time-lapse-enable") {
            int32_t captureFpsEnable;
            if (safe_strtoi32(value.string(), &captureFpsEnable)) {
                return setParamCaptureFpsEnable(captureFpsEnable);
            }
        } else if (key == "time-lapse-fps") {
            double fps;
            if (safe_strtod(value.string(), &fps)) {
                return setParamCaptureFps(fps);
            }
        }else if (key == "record_preset" || key == "routing_by_name") { 
            mParams = String8(key.string());
            mParams = String8(mParams + "=" + value.string());
            if (mAudioSourceNode != NULL) {
                return mAudioSourceNode->setParameters(mParams);
            } else {
                ALOGD("setParameter mAudioSourceNode is NULL");
                return OK;
            }
        }else { 
            ALOGE("setParameter: failed to find key %s", key.string());
        }
        return BAD_VALUE;
    }
    

    但是,使用MediaMuxer.java的话和MediaRecoder是不同的路径,MeidaMuxer需要配置MediaFormat, 然后传到MediaMuxer.cpp里面,addTrack将MediaFormat信息传入,然后设置meta信息,研究了下,这部分convertMessageToMetaData并没有对这个值进行处理,如果要支持,需要把它设下去。

    ssize_t MediaMuxer::addTrack(const sp<AMessage> &format) {
        Mutex::Autolock autoLock(mMuxerLock);
    
        if (format.get() == NULL) {
            ALOGE("addTrack() get a null format");
            return -EINVAL;
        }
    
        if (mState != INITIALIZED) {
            ALOGE("addTrack() must be called after constructor and before start().");
            return INVALID_OPERATION;
        }
    
        sp<MetaData> trackMeta = new MetaData;
        convertMessageToMetaData(format, trackMeta);
    
        sp<MediaAdapter> newTrack = new MediaAdapter(trackMeta);
        status_t result = mWriter->addSource(newTrack);
        if (result == OK) {
            return mTrackList.add(newTrack);
        }
        return -1;
    }
    

    相关文章

      网友评论

          本文标题:MediaMuxer 保存文件的4G限制

          本文链接:https://www.haomeiwen.com/subject/brrbvctx.html