简体   繁体   中英

How can i share a sound file, to facebook or Twitter in iphone

Hi i am working on application in which , i have to upload a sound file to Facebook.

Please ,provide me a better solution, whether it is possible to share a sound file on Facebook or not.

Thanks in advance

使用AVAssetExportSession,用声音文件创建电影,然后将其上传到Facebook。

This is possible to do but it is a bit of a pain. To do this you must convert the audio file into a video file and then post it to Facebook as a video.

First we need to have access to our audioFile, you should already have this, if not then there are a lot of Stackoverflow questions devoted to this, I won't complicate matters by going off track. We then create a NSURL to a video in our documents. In this case we have an video named video_base.mp4 which has been designed to be a nice background for our audio track. Finally we merge the files before sharing the returned file to Facebook.

- (IBAction)shareToFacebook:(id)sender {

    // You should already have your audio file saved
    NSString * songFileName = [self getSongFileName];

    NSArray * searchPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString * documentPath = [searchPaths objectAtIndex:0];

    NSString * file = [documentPath stringByAppendingPathComponent:songFileName];
    NSURL * audioFileURL = [NSURL fileURLWithPath: audioFile];
    NSURL * videoFileURL = [NSURL fileURLWithPath:[NSFileManager getFilePath:@"video_base.mp4" withFolder:@""]];

    [self mergeAudio:audioFileURL andVideo:videoFileURL withSuccess:^(NSURL * url) {

        // Now we have the URL of the video file
        [self shareVideoToFacebook:url];
    }];
}

Credit to @dineshprasanna for this part of the code which can be found here . We want to merge our audio and video and then save them to a path. We then return the exportURL in the completion block.

- (void)mergeAudio: (NSURL *)audioURL andVideo: (NSURL *)videoURL withSuccess:(void (^)(NSURL * url))successBlock {

    AVURLAsset* audioAsset = [[AVURLAsset alloc]initWithURL:audioURL options:nil];
    AVURLAsset* videoAsset = [[AVURLAsset alloc]initWithURL:videoURL options:nil];

    AVMutableComposition * mixComposition = [AVMutableComposition composition];

    AVMutableCompositionTrack * compositionCommentaryTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeAudio
                                                                                     preferredTrackID:kCMPersistentTrackID_Invalid];
    [compositionCommentaryTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, audioAsset.duration)
                                    ofTrack:[[audioAsset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0]
                                     atTime:kCMTimeZero error:nil];

    AVMutableCompositionTrack *compositionVideoTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeVideo
                                                                               preferredTrackID:kCMPersistentTrackID_Invalid];
    [compositionVideoTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, videoAsset.duration)
                               ofTrack:[[videoAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0]
                                atTime:kCMTimeZero error:nil];

    AVAssetExportSession* _assetExport = [[AVAssetExportSession alloc] initWithAsset:mixComposition
                                                                      presetName:AVAssetExportPresetHighestQuality];

    NSString * videoName = @"export.mov";

    NSString * exportPath = [NSTemporaryDirectory() stringByAppendingPathComponent:videoName];
    NSURL    * exportUrl = [NSURL fileURLWithPath:exportPath];

    if ([[NSFileManager defaultManager] fileExistsAtPath:exportPath]) {
        [[NSFileManager defaultManager] removeItemAtPath:exportPath error:nil];
    }

    _assetExport.outputFileType = @"com.apple.quicktime-movie";
    _assetExport.outputURL = exportUrl;
    _assetExport.shouldOptimizeForNetworkUse = YES;

    [_assetExport exportAsynchronouslyWithCompletionHandler: ^(void ) {
        if(successBlock) successBlock(exportUrl);
    }];
}

Finally we want to save our return videoURL to Facebook. It is worth noting that we need a few libraries to be added for this functionality to work:

#import <AssetsLibrary/AssetsLibrary.h>
#import <FBSDKCoreKit/FBSDKCoreKit.h>
#import <FBSDKShareKit/FBSDKShareKit.h>

We then share the merged file to Facebook:

- (void)shareVideoToFacebook: (NSURL *)videoURL {

    ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
    ALAssetsLibraryWriteVideoCompletionBlock videoWriteCompletionBlock = ^(NSURL *newURL, NSError *error) {
        if(error) {
            NSLog( @"Error writing image with metadata to Photo Library: %@", error );
        } else {
            NSLog( @"Wrote image with metadata to Photo Library %@", newURL.absoluteString);

            FBSDKShareDialog *shareDialog = [[FBSDKShareDialog alloc]init];
            NSURL *videoURL = newURL;

            FBSDKShareVideo *video = [[FBSDKShareVideo alloc] init];
            video.videoURL = videoURL;

            FBSDKShareVideoContent *content = [[FBSDKShareVideoContent alloc] init];
            content.video = video;

            [FBSDKShareDialog showFromViewController:self
                                     withContent:content
                                        delegate:nil];
        }
    };

    if([library videoAtPathIsCompatibleWithSavedPhotosAlbum:videoURL]) {
        [library writeVideoAtPathToSavedPhotosAlbum:videoURL
                                completionBlock:videoWriteCompletionBlock];
    }
}

This should open up the Facebook app and then allow the user to share their audio file on their wall with a background of the video stored in your app.

Obviously everyone's project is different, this means you might not be able to copy paste this code exactly into your project. I have tried to split up the process meaning it should be easy to extrapolate to get audio messages uploading successfully.

Facebook does not have sound uploading. You could always upload the sound file elsewhere and use Facebook to share the link to it.

if you check the webApps for twitter/facebook, they does not provide any means to UPLOAD an audio file.

Twittier allows only text post and on the other hand, Facebook allow Image/Video to be uploaded.

In the light of these facts, I do not think it is possible without a url share.

It is not possible to upload audio files to Facebook, only photos and videos are allowed. However, another solution would be to upload the audio file somewhere else and then use the Facebook API to post a link using that reference. One place you may wish to look to upload audio is http://developers.soundcloud.com/

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM