「小程序JAVA實(shí)戰(zhàn)」小程序視頻處理工具ffmpeg(47)

原創(chuàng)文章只恨,歡迎轉(zhuǎn)載译仗。轉(zhuǎn)載請(qǐng)注明:轉(zhuǎn)載自IT人故事會(huì)抬虽,謝謝!
原文鏈接地址:「小程序JAVA實(shí)戰(zhàn)」小程序視頻處理工具ffmpeg(47)

前面已經(jīng)把視頻成功的上傳到我們的服務(wù)器纵菌,選擇了背景音樂(lè)的ID阐污,現(xiàn)在需要把視頻和背景音樂(lè)進(jìn)行合并,需要使用一個(gè)工具ffmpeg咱圆。源碼:https://github.com/limingios/wxProgram.git 中wx-springboot 和 No.15

ffmpeg

  • 介紹

視音頻處理工具笛辟,跨平臺(tái)的視音頻處理解決方案,主頁(yè):http://ffmpeg.org

  • 應(yīng)用的場(chǎng)景
  1. 播放器:射手播放器序苏,暴風(fēng)影音手幢,迅雷播放器……
  2. 轉(zhuǎn)換工具:格式工廠,剪輯工具……
  3. 直播忱详,視頻加碼围来,濾鏡,水印匈睁,特效……
  • 下載


根據(jù)你的需求進(jìn)行下載监透,我選擇在windows平臺(tái)來(lái)進(jìn)行下載

  • 測(cè)試
C:\Users\Administrator>D:

D:\>cd D:\Program Files\ffmpeg

D:\Program Files\ffmpeg>cd bin

D:\Program Files\ffmpeg\bin>ffmpeg.exe -i shanzhu.mp4 shanzhu.avi
ffmpeg version N-91949-g6304268e39 Copyright (c) 2000-2018 the FFmpeg developers
  built with gcc 8.2.1 (GCC) 20180813
  configuration: --enable-gpl --enable-version3 --enable-sdl2 --enable-fontconfig --enable-gnutls --enable-iconv --enable-libass --enable-libbluray --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libtheora --enable-libtwolame --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libzimg --enable-lzma --enable-zlib --enable-gmp --enable-libvidstab --enable-libvorbis --enable-libvo-amrwbenc --enable-libmysofa --enable-libspeex --enable-libxvid --enable-libaom --enable-libmfx --enable-amf --enable-ffnvcodec --enable-cuvid --enable-d3d11va --enable-nvenc --enable-nvdec --enable-dxva2 --enable-avisynth
  libavutil      56. 19.101 / 56. 19.101
  libavcodec     58. 30.100 / 58. 30.100
  libavformat    58. 18.100 / 58. 18.100
  libavdevice    58.  4.103 / 58.  4.103
  libavfilter     7. 31.100 /  7. 31.100
  libswscale      5.  2.100 /  5.  2.100
  libswresample   3.  2.100 /  3.  2.100
  libpostproc    55.  2.100 / 55.  2.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'shanzhu.mp4':
  Metadata:
    major_brand     : mp42
    minor_version   : 1
    compatible_brands: mp41mp42isom
    creation_time   : 2018-09-16T05:29:47.000000Z
  Duration: 00:00:09.34, start: 0.000000, bitrate: 1210 kb/s
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709), 544x960, 1159 kb/s, 29.97 fps, 29.97 tbr, 600 tbn, 1200 tbc (default)
    Metadata:
      creation_time   : 2018-09-16T05:29:47.000000Z
      handler_name    : Core Media Video
    Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, mono, fltp, 46 kb/s (default)
    Metadata:
      creation_time   : 2018-09-16T05:29:47.000000Z
      handler_name    : Core Media Audio
Stream mapping:
  Stream #0:0 -> #0:0 (h264 (native) -> mpeg4 (native))
  Stream #0:1 -> #0:1 (aac (native) -> mp3 (libmp3lame))
Press [q] to stop, [?] for help
Output #0, avi, to 'shanzhu.avi':
  Metadata:
    major_brand     : mp42
    minor_version   : 1
    compatible_brands: mp41mp42isom
    ISFT            : Lavf58.18.100
    Stream #0:0(und): Video: mpeg4 (FMP4 / 0x34504D46), yuv420p, 544x960, q=2-31, 200 kb/s, 29.97 fps, 29.97 tbn, 29.97 tbc (default)
    Metadata:
      creation_time   : 2018-09-16T05:29:47.000000Z
      handler_name    : Core Media Video
      encoder         : Lavc58.30.100 mpeg4
    Side data:
      cpb: bitrate max/min/avg: 0/0/200000 buffer size: 0 vbv_delay: -1
    Stream #0:1(und): Audio: mp3 (libmp3lame) (U[0][0][0] / 0x0055), 44100 Hz, mono, fltp (default)
    Metadata:
      creation_time   : 2018-09-16T05:29:47.000000Z
      handler_name    : Core Media Audio
      encoder         : Lavc58.30.100 libmp3lame
frame=  280 fps=0.0 q=31.0 Lsize=    1096kB time=00:00:09.34 bitrate= 961.3kbits/s speed=16.7x
video:999kB audio:72kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 2.338377%

  • java程序調(diào)用cmd轉(zhuǎn)換視頻

springboot-common中添加FFMpegTest

package com.idig8.utils;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

public class FFMpegTest {

    private String ffmpegEXE;
    
    public FFMpegTest(String ffmpegEXE) {
        super();
        this.ffmpegEXE = ffmpegEXE;
    }
    
    public void convertor(String videoInputPath, String videoOutputPath) throws Exception {
//      ffmpeg -i input.mp4 -y output.avi
        List<String> command = new ArrayList<>();
        command.add(ffmpegEXE);
        
        command.add("-i");
        command.add(videoInputPath);
        command.add("-y");
        command.add(videoOutputPath);
        
        for (String c : command) {
            System.out.print(c + " ");
        }
        
        ProcessBuilder builder = new ProcessBuilder(command);
        Process process = builder.start();
        
        InputStream errorStream = process.getErrorStream();
        InputStreamReader inputStreamReader = new InputStreamReader(errorStream);
        BufferedReader br = new BufferedReader(inputStreamReader);
        
        String line = "";
        while ( (line = br.readLine()) != null ) {
        }
        
        if (br != null) {
            br.close();
        }
        if (inputStreamReader != null) {
            inputStreamReader.close();
        }
        if (errorStream != null) {
            errorStream.close();
        }
        
    }

    public static void main(String[] args) {
        FFMpegTest ffmpeg = new FFMpegTest("D:\\Program Files\\ffmpeg\\bin\\ffmpeg.exe");
        try {
            ffmpeg.convertor("D:\\Program Files\\ffmpeg\\bin\\shanzhu.mp4", "D:\\Program Files\\ffmpeg\\bin\\shanzhu.avi");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

  • 視頻音頻合并命令

通過(guò)這種方式,可以讓我們的mp4和我們的mp3 做一個(gè)結(jié)合航唆。

ffmpeg.exe -i shanzhu.avi -i music.mp3 -t 10 -y 合并音樂(lè)和視頻.avi
D:\Program Files\ffmpeg\bin>ffmpeg.exe -i shanzhu.avi -i music.mp3 -t 10 -y 合并音樂(lè)和視頻.avi
ffmpeg version N-91949-g6304268e39 Copyright (c) 2000-2018 the FFmpeg developers
  built with gcc 8.2.1 (GCC) 20180813
  configuration: --enable-gpl --enable-version3 --enable-sdl2 --enable-fontconfig --enable-gnutls --enable-iconv --enable-libass --enable-libbluray --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libtheora --enable-libtwolame --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libzimg --enable-lzma --enable-zlib --enable-gmp --enable-libvidstab --enable-libvorbis --enable-libvo-amrwbenc --enable-libmysofa --enable-libspeex --enable-libxvid --enable-libaom --enable-libmfx --enable-amf --enable-ffnvcodec --enable-cuvid --enable-d3d11va --enable-nvenc --enable-nvdec --enable-dxva2 --enable-avisynth
  libavutil      56. 19.101 / 56. 19.101
  libavcodec     58. 30.100 / 58. 30.100
  libavformat    58. 18.100 / 58. 18.100
  libavdevice    58.  4.103 / 58.  4.103
  libavfilter     7. 31.100 /  7. 31.100
  libswscale      5.  2.100 /  5.  2.100
  libswresample   3.  2.100 /  3.  2.100
  libpostproc    55.  2.100 / 55.  2.100
Input #0, avi, from 'shanzhu.avi':
  Metadata:
    encoder         : Lavf58.18.100
  Duration: 00:00:09.38, start: 0.000000, bitrate: 957 kb/s
    Stream #0:0: Video: mpeg4 (Simple Profile) (FMP4 / 0x34504D46), yuv420p, 544x960 [SAR 1:1 DAR 17:30], 876 kb/s, 29.97 fps, 29.97 tbr, 29.97 tbn, 30k tbc
    Stream #0:1: Audio: mp3 (U[0][0][0] / 0x0055), 44100 Hz, mono, fltp, 64 kb/s
[mp3 @ 000001fcfa57d6c0] Estimating duration from bitrate, this may be inaccurate
Input #1, mp3, from 'music.mp3':
  Duration: 00:00:33.47, start: 0.000000, bitrate: 320 kb/s
    Stream #1:0: Audio: mp3, 48000 Hz, stereo, fltp, 320 kb/s
Stream mapping:
  Stream #0:0 -> #0:0 (mpeg4 (native) -> mpeg4 (native))
  Stream #1:0 -> #0:1 (mp3 (mp3float) -> mp3 (libmp3lame))
Press [q] to stop, [?] for help
Output #0, avi, to '鍚堝茍闊充箰鍜岃棰?avi':
  Metadata:
    ISFT            : Lavf58.18.100
    Stream #0:0: Video: mpeg4 (FMP4 / 0x34504D46), yuv420p(progressive), 544x960 [SAR 1:1 DAR 17:30], q=2-31, 200 kb/s, 29.97 fps, 29.97 tbn, 29.97 tbc
    Metadata:
      encoder         : Lavc58.30.100 mpeg4
    Side data:
      cpb: bitrate max/min/avg: 0/0/200000 buffer size: 0 vbv_delay: -1
    Stream #0:1: Audio: mp3 (libmp3lame) (U[0][0][0] / 0x0055), 48000 Hz, stereo, fltp
    Metadata:
      encoder         : Lavc58.30.100 libmp3lame
frame=  280 fps=274 q=31.0 Lsize=    1076kB time=00:00:10.00 bitrate= 880.4kbits/s speed=9.79x
video:892kB audio:157kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 2.510280%
  • java程序調(diào)用cmd轉(zhuǎn)換視頻增加音頻
package com.idig8.utils;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

public class MergeVideoMp3 {

    private String ffmpegEXE;
    
    public MergeVideoMp3(String ffmpegEXE) {
        super();
        this.ffmpegEXE = ffmpegEXE;
    }
    
    public void convertor(String videoInputPath, String mp3InputPath,
            double seconds, String videoOutputPath) throws Exception {
//      ffmpeg.exe -i 蘇州大褲衩.mp4 -i bgm.mp3 -t 7 -y 新的視頻.mp4
        List<String> command = new ArrayList<>();
        command.add(ffmpegEXE);
        
        command.add("-i");
        command.add(videoInputPath);
        
        command.add("-i");
        command.add(mp3InputPath);
        
        command.add("-t");
        command.add(String.valueOf(seconds));
        
        command.add("-y");
        command.add(videoOutputPath);
        
//      for (String c : command) {
//          System.out.print(c + " ");
//      }
        
        ProcessBuilder builder = new ProcessBuilder(command);
        Process process = builder.start();
        
        InputStream errorStream = process.getErrorStream();
        InputStreamReader inputStreamReader = new InputStreamReader(errorStream);
        BufferedReader br = new BufferedReader(inputStreamReader);
        
        String line = "";
        while ( (line = br.readLine()) != null ) {
        }
        
        if (br != null) {
            br.close();
        }
        if (inputStreamReader != null) {
            inputStreamReader.close();
        }
        if (errorStream != null) {
            errorStream.close();
        }
        
    }

    public static void main(String[] args) {
        MergeVideoMp3 ffmpeg = new MergeVideoMp3("D:\\Program Files\\ffmpeg\\bin\\ffmpeg.exe");
        try {
            ffmpeg.convertor("D:\\Program Files\\ffmpeg\\bin\\shanzhu.mp4", "D:\\Program Files\\ffmpeg\\bin\\music.mp3", 7.1, "D:\\Program Files\\ffmpeg\\bin\\合并音樂(lè)和視頻.avi");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

開(kāi)發(fā)功能

視頻上傳后通過(guò)java調(diào)用ffmpge.exe完成音樂(lè)和視頻的合并才漆,并將視頻信息保存在數(shù)據(jù)庫(kù)中。

  • 視頻service開(kāi)發(fā)
    VideoService
package com.idig8.service;

import com.idig8.pojo.Videos;

public interface VideoService {

    
    /**
     * 保存視頻信息
     * @param Id
     * @return
     */
    public void saveVideo(Videos video);
}
    

VideoServiceImpl

package com.idig8.service.Impl;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import com.idig8.mapper.BgmMapper;
import com.idig8.pojo.Bgm;
import com.idig8.service.BgmService;

@Service
public class BgmServiceImpl implements BgmService {

    @Autowired
    private BgmMapper bgmMapper;
    
    
    @Transactional(propagation =Propagation.SUPPORTS)
    @Override
    public List<Bgm> queryBgmList(){
        
        return bgmMapper.selectAll();
    }
    
    @Transactional(propagation =Propagation.SUPPORTS)
    @Override
    public Bgm queryBgmById(String Id){
        
        return bgmMapper.selectByPrimaryKey(Id);
    }

}

BgmService

package com.idig8.service;

import java.util.List;

import com.idig8.pojo.Bgm;

public interface BgmService {

    /**
     * 獲取所有的Bgm列表
     * @return
     */
    public List<Bgm> queryBgmList();
    
    /**
     * 通過(guò)bgmId獲取Bgm對(duì)象
     * @param Id
     * @return
     */
    public Bgm queryBgmById(String Id);
}
    
    

BgmServiceImpl

package com.idig8.service.Impl;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import com.idig8.mapper.BgmMapper;
import com.idig8.pojo.Bgm;
import com.idig8.service.BgmService;

@Service
public class BgmServiceImpl implements BgmService {

    @Autowired
    private BgmMapper bgmMapper;
    
    
    @Transactional(propagation =Propagation.SUPPORTS)
    @Override
    public List<Bgm> queryBgmList(){
        
        return bgmMapper.selectAll();
    }
    
    @Transactional(propagation =Propagation.SUPPORTS)
    @Override
    public Bgm queryBgmById(String Id){
        
        return bgmMapper.selectByPrimaryKey(Id);
    }

}

VideoController

package com.idig8.controller;

import java.io.File;
import java.util.Date;
import java.util.UUID;

import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import com.idig8.pojo.Bgm;
import com.idig8.pojo.Videos;
import com.idig8.service.BgmService;
import com.idig8.service.VideoService;
import com.idig8.utils.JSONResult;
import com.idig8.utils.MergeVideoMp3;
import com.idig8.utils.enums.VideoStatusEnum;
import com.idig8.utils.file.FileUtil;

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;


@RestController
@Api(value="視頻相關(guān)業(yè)務(wù)的接口", tags= {"視頻相關(guān)業(yè)務(wù)的controller"})
@RequestMapping("/video")
public class VideoController extends BasicController {
    
    @Autowired
    private BgmService bgmService;
    
    @Autowired
    private VideoService videosService;
    
    @Value("${server.file.path}")
    private String fileSpace;
    
    @Value("${server.ffmpeg.path}")
    private String ffmpegexe;
    
    
    @ApiOperation(value="上傳視頻", notes="上傳視頻的接口")
    @ApiImplicitParams({
        @ApiImplicitParam(name="userId", value="用戶id", required=true, 
                dataType="String", paramType="form"),
        @ApiImplicitParam(name="bgmId", value="背景音樂(lè)id", required=false, 
                dataType="String", paramType="form"),
        @ApiImplicitParam(name="videoSeconds", value="背景音樂(lè)播放長(zhǎng)度", required=true, 
                dataType="String", paramType="form"),
        @ApiImplicitParam(name="videoWidth", value="視頻寬度", required=true, 
                dataType="String", paramType="form"),
        @ApiImplicitParam(name="videoHeight", value="視頻高度", required=true, 
                dataType="String", paramType="form"),
        @ApiImplicitParam(name="desc", value="視頻描述", required=false, 
                dataType="String", paramType="form")
    })
    @PostMapping(value="/upload", headers="content-type=multipart/form-data")
    public JSONResult upload(String userId, 
                String bgmId, double videoSeconds, 
                int videoWidth, int videoHeight,
                String desc,
                @ApiParam(value="短視頻", required=true)
                MultipartFile file) throws Exception {
        
        if (StringUtils.isBlank(userId)) {
            return JSONResult.errorMsg("用戶id不能為空...");
        }
        // 文件保存的命名空間
        String fileName = file.getOriginalFilename();
        // 保存到數(shù)據(jù)庫(kù)中的相對(duì)路徑
        String path = "";
        String videOutPath = "";
        try {
             path = FileUtil.uploadFile(file.getBytes(), fileSpace, fileName);
            } catch (Exception e) {
                e.getStackTrace();
                   return JSONResult.errorMsg(e.getMessage());
            }                
         
    
        if(StringUtils.isNotBlank(bgmId)){
            Bgm bgm = bgmService.queryBgmById(bgmId);
            String mp3BgmPath = fileSpace + bgm.getPath();
            MergeVideoMp3 mergeVideoMp3 = new MergeVideoMp3(ffmpegexe);
            String videOutPathName = UUID.randomUUID().toString()+".mp4";
            File targetFile = new File(fileSpace + userId);
            if (!targetFile.exists()) {
                targetFile.mkdirs();
            }
            videOutPath = "/"+userId+"/"+videOutPathName;
            String videoInput = fileSpace +path;
            mergeVideoMp3.convertor(videoInput, mp3BgmPath, videoSeconds, fileSpace +videOutPath);
        }
        
        
        Videos videos = new Videos();
        videos.setAudioId(bgmId);
        videos.setCreateTime(new Date());
        videos.setVideoDesc(desc);
        videos.setId(UUID.randomUUID().toString());
        videos.setUserId(userId);
        videos.setVideoHeight(videoHeight);
        videos.setVideoWidth(videoWidth);
        videos.setVideoPath(videOutPath);
        videos.setStatus(VideoStatusEnum.SUCCESS.value);
        videosService.saveVideo(videos);
                 
        return JSONResult.ok(path);
        
    }
}

PS:已經(jīng)完成了視頻的上傳佛点,并把相關(guān)的信息保存在數(shù)據(jù)庫(kù)中醇滥。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市超营,隨后出現(xiàn)的幾起案子鸳玩,更是在濱河造成了極大的恐慌,老刑警劉巖演闭,帶你破解...
    沈念sama閱讀 221,548評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件不跟,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡米碰,警方通過(guò)查閱死者的電腦和手機(jī)窝革,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)吕座,“玉大人虐译,你說(shuō)我怎么就攤上這事∥馀浚” “怎么了漆诽?”我有些...
    開(kāi)封第一講書(shū)人閱讀 167,990評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我厢拭,道長(zhǎng)兰英,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,618評(píng)論 1 296
  • 正文 為了忘掉前任供鸠,我火速辦了婚禮畦贸,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘楞捂。我一直安慰自己薄坏,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,618評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布泡一。 她就那樣靜靜地躺著颤殴,像睡著了一般。 火紅的嫁衣襯著肌膚如雪鼻忠。 梳的紋絲不亂的頭發(fā)上涵但,一...
    開(kāi)封第一講書(shū)人閱讀 52,246評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音帖蔓,去河邊找鬼矮瘟。 笑死,一個(gè)胖子當(dāng)著我的面吹牛塑娇,可吹牛的內(nèi)容都是我干的澈侠。 我是一名探鬼主播,決...
    沈念sama閱讀 40,819評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼埋酬,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼哨啃!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起写妥,我...
    開(kāi)封第一講書(shū)人閱讀 39,725評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤拳球,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后珍特,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體祝峻,經(jīng)...
    沈念sama閱讀 46,268評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,356評(píng)論 3 340
  • 正文 我和宋清朗相戀三年扎筒,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了莱找。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,488評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡嗜桌,死狀恐怖奥溺,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情症脂,我是刑警寧澤谚赎,帶...
    沈念sama閱讀 36,181評(píng)論 5 350
  • 正文 年R本政府宣布淫僻,位于F島的核電站诱篷,受9級(jí)特大地震影響壶唤,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜棕所,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,862評(píng)論 3 333
  • 文/蒙蒙 一闸盔、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧琳省,春花似錦迎吵、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,331評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至桦他,卻和暖如春蔫巩,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背快压。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,445評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工圆仔, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蔫劣。 一個(gè)月前我還...
    沈念sama閱讀 48,897評(píng)論 3 376
  • 正文 我出身青樓坪郭,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親脉幢。 傳聞我的和親對(duì)象是個(gè)殘疾皇子歪沃,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,500評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容